[tpm] Regex question

Fernando Oliveira fernandocorrea at gmail.com
Wed Jul 9 09:41:34 PDT 2008


in this case, I would prefer:

$name = "Alan Rocker";
($first_name, @other_names) = split/\s+/, $name;


2008/7/9 Indy Singh <indy at indigostar.com>:

> Alan,
> If you are suggesting that it is better to have left it as the original
> multi line code instead of the compressed version,  I am not sure that I
> agree with that.
>
> Here is an example using different variable names to clarify the intent:
> First written your way:
> 1: $name = "Alan Rocker";
> 2: $first_name = $name;
> 3: $first_name =~ s/\s.*$//;        # remove the last name
>
> The problem I have with this code is that if you look at line 2, it is
> temporarily wrong.  At this point $first_name contains the full name so it
> is wrong.  Then we correct the error on line 3.  Since I read code one line
> at a time, my brain throws an exception when I see line 2.  It is possible
> to somewhat clarify the intent my merging line 2 and 3:
>
> $first_name = $name; $first_name =~ s/\s.*$//;
>
> But I really prefer the following method:
> 1: $full_name = "Alan Rocker";
> 2: ($first_name) = $full_name =~ /(*?)\s/;
>
> In this example at any point the varaibles only ever contain what they are
> supposed to contain, i.e.  $first_name actually contains the first name.
>
> To further expand the example to include a common need to split fields from
> a line:
> 1: $full_name = "Alan Rocker";
> 2: ($first_name, $last_name) = $full_name =~ /(*?)\s(.*)/;
>
> (Note untested code, may contain bugs)
>
> Now, where did I put my accordian? ...
>
> Indy Singh
> IndigoSTAR Software -- www.indigostar.com
>
>
> ----- Original Message ----- From: <arocker at vex.net>
> To: "Toronto Perl Mongers" <tpm at to.pm.org>
> Sent: Wednesday, July 09, 2008 11:51 AM
> Subject: Re: [tpm] Regex question
>
>
>
>  Madi's original question, and one typical response:
>>
>>  my $foo="ABC-987-01";
>>>> my $bar=$foo;
>>>> $bar=~s/(\w+-\d+)-\d+/$1/;
>>>> # $bar now 'ABC-987'.
>>>>
>>>> That's three lines. Is there a way to do this in one line?
>>>>
>>>
>>> Maybe I misunderstood the question...  You can say
>>>
>>>   my ($bar) = $foo =~ /(\w+-\d+)-\d+/;
>>>
>>> which will assing $1 to $bar if the match succeeds.
>>>
>>>  Compressing the assignment (which really doesn't include the original
>> setting of $foo) saves one line ad one naming of $bar at the expense of
>> complexity and inflexibility.
>>
>> To comprehend the expression, you have to keep an extra level on the
>> mental stack, and if you want to change the destination you risk changing
>> the regex. (The two expressions aren't completely equivalent; the original
>> doesn't change $foo, the other, like most of the suggestions, does.)
>>
>> Sometimes, it pays to remember the KISS principle, and the joke (?) about
>> a gentleman being a man who knows how to play the accordion, but doesn't.
>>
>> _______________________________________________
>> toronto-pm mailing list
>> toronto-pm at pm.org
>> http://mail.pm.org/mailman/listinfo/toronto-pm
>>
>
> _______________________________________________
> toronto-pm mailing list
> toronto-pm at pm.org
> http://mail.pm.org/mailman/listinfo/toronto-pm
>



-- 
Just another Perl Hacker,
Fernando (SmokeMachine)
http://perl-e.org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/toronto-pm/attachments/20080709/f71be34f/attachment.html>


More information about the toronto-pm mailing list