[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Omaha.pm] Fwd: weird perl bug



On Nov 18, 2010, at 10:20 PM, Dan Linder wrote:
> The "/g" flag carries across multiple matching calls/lines?
> 
> Learn something new every day...  Thanks!

Ya, Andy's explanation helped me too. At a glance I had no idea what was going on.  :)

In array context all the /g matches are slurped out "in one line of code:"

   my (@words) = ( $string =~ /(\w+)/g );

And nothing "weird" happens. But in scalar context perl "remembers" so that functions like pos() can do their thing. I used pos() frequently in bioinformatics work (genetic sequence searches):

   $ cat j.pl
   my $string = "foo bar baz boogity baggity";
   while ($string =~ /(\w+)/g) {
      printf("%s match ended at position %s\n", $1, pos($string));
      # and do whatever else you want. perl remembers where you were
      # in the $string =~ match above!
   }

   $ perl j.pl  
   foo match ended at position 3
   bar match ended at position 7
   baz match ended at position 11
   boogity match ended at position 19
   baggity match ended at position 27

:)

Jay Hannah
Software Architect
jhannah@mutationgrid.com | http://mutationgrid.com | 1-402-598-7782