[tpm] Regex question

Jim Graham james.a.graham at gmail.com
Wed Jul 9 09:45:25 PDT 2008


To follow up ...

   The code I posted a while back ...

     my $foo='ABC-987-01';
     ( my $bar = $foo ) =~ s{(\w+-\d+)-\d+}{$1};

does do a replace (not just a match), but not on $foo. The replace is  
done on $bar immediately following the assignment. Whether this  
triggers an ILE (Indy Line Exception) I don't know ...

   - Jim

On 9-Jul-08, at 12:27 PM, Indy Singh wrote:

> 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



More information about the toronto-pm mailing list