cool use for map

Peter Scott Peter at PSDT.com
Wed Oct 30 10:58:57 CST 2002


At 07:22 PM 10/29/2002 -0800, nkuipers wrote:
>@found = map { $1 } $searchthis =~ m/($forthis)/g;

Um, I do not think this does what you intend.  It gives you a copy of the 
last $1 for each match:

% perl -le '@x = map { $1 } "ab12cd3f g" =~ /([a-z])/g; print join " * ", @x'
g * g * g * g * g * g

Whereas if you do

   @found = $searchthis =~ /($forthis)/g;

since the result of a /g match in list context is the list of all capturing 
parentheses matches, you get

%  perl -le '@x = "ab12cd3f g" =~ /([a-z])/g; print join " * ", @x'
a * b * c * d * f * g

which seems considerably more useful... and less obscure.

>As written, it's not terribly useful unless you are interested in how many
>times $forthis matches and put @found in scalar context.  But if you
>substitute a quantified character class for $forthis, suddenly you are
>extracting from a sequence all runs of hydrophobic amino acid residues,
>lowercase nucleotides, and so forth, all in one line.  I didn't think you
>could use a regex as the list context construct in map, but decided to try it
>rather than rolling another clunky "while matches push array and return once
>finished".  Actually it's part of a method that maps to @found differently
>using if-elsif-elsif... so the one-lining is much nicer on the eyes.  Yay
>Perl.

Peter Scott
peter at psdt.com
http://www.perldebugged.com




More information about the Victoria-pm mailing list