You may be tempted to do the following, but it won't work:
It'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.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/..*..*./); # undef
You have to do something ugly like this to get around it:
or thissub match_all_ways { use vars '$count'; my ($string, $regex) = @_; local $count = 0; my $incr = qr/(?{$count++})/; $string =~ /(?:$regex)$incr(?!)/; return $count; }
So yes, it can be done programatically without use re 'eval', but it's non-trivial and a little messy ;){ my $count; my $incr = qr/(?{$count++})/; sub match_all_ways { my ($string, $regex) = @_; $count = 0; $string =~ /(?:$regex)$incr(?!)/; return $count; } }
blokhead
In reply to Re^3: Regexes: finding ALL matches (including overlap)
by blokhead
in thread Regexes: finding ALL matches (including overlap)
by kaif
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |