Do you know what kinds of things can go wrong?
Backtracking can screw things up:
my $count; 'ac' =~ / a (?{ $count++ }) b | a (?{ $count++ }) c /x; # 1. Matches 'a' in first branch. # 2. Increments $count to 1. # 3. Fails to match 'b'. # 4. Matches 'a' in second branch. # 5. Increments $count to 2. # 6. Matches 'c'. print("$count\n"); # 2
The fix is to use local. When the regexp backtracks through a local, the old value is restored. The old value is also restored when the regexp succesfully matches, so you need to save the result.
my $count; our $c = 0; 'ac' =~ / (?: a (?{ local $c = $c + 1 }) b | a (?{ local $c = $c + 1 }) c ) (?{ $count = $c }) # Save result. /x; # 1. Matches 'a' in first branch. # 2. Increments $c to 1. # 3. Fails to match 'b'. # 4. Undoes increment ($c = 0). # 5. Matches 'a' in second branch. # 6. Increments $c to 1. # 7. Matches 'c'. # 8. $count = $c. print("$count\n"); # 1
In reply to Re^3: Regexes: finding ALL matches (including overlap)
by ikegami
in thread Regexes: finding ALL matches (including overlap)
by kaif
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |