[tpm] Regex question

Indy Singh indy at indigostar.com
Wed Jul 9 09:27:35 PDT 2008

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 

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 

More information about the toronto-pm mailing list