in reply to Re^3: Regexes: finding ALL matches (including overlap)
in thread Regexes: finding ALL matches (including overlap)
sub match_all_ways { my ($string, $regex) = @_; my $count; my $incr = qr/(?{$count++})/; $string =~ /(?:$regex)$incr(?!)/; return $count; } print match_all_ways("abcdef", qr/..*..*./); # 20 print match_all_ways("abcdef", qr/..*..*./); # undefIt's because the qr// object is compiled just once and always refers to the first instance of $count. If you call this sub more than once, you will always get undef.
I see what you mean by lexicals closured in regexes not behaving as one would expect. I would have expected the second print to produce 40 instead of undef (i.e. I would have expected $count to behave like a C static variable, as is the case for "regular" closures). Is there any way to rationalize the actual behavior without diving too deeply into the Perl internals? (I ask because without some rationalization for such an odd behavior there is little chance I will remember it.)
the lowliest monk
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^5: Regexes: finding ALL matches (including overlap) (its a bug)
by demerphq (Chancellor) on Jun 04, 2005 at 16:47 UTC |