http://qs321.pair.com?node_id=731328


in reply to Extracting the number of repetitions from a regex

It's a scoping issue. Apparently, the regex uses the variables that existed when it was first compiled, while you have declared a new set of variables on every pass. Or something like that. Anyway, this works:
my @strings = qw( aaabbbb ab abb aabb aaabb aabbb ); { my ($a_counter, $b_counter); for my $string ( @strings ) { $a_counter = 0; $b_counter = 0; print "In $string there were $a_counter 'a's and $b_counter 'b's. +\n" if ( $string =~ /(a(?{$a_counter ++;}))+(b(?{$b_counter ++;}))+/ +); } }

Caution: Contents may have been coded under pressure.

Replies are listed 'Best First'.
Re^2: Extracting the number of repetitions from a regex
by pat_mc (Pilgrim) on Dec 18, 2008 at 20:30 UTC
    Roy -

    Thanks for shedding some light onto this issue. I am grateful for your functional modification of the code which does indeed produce the desired output.

    As for the reasoning why the original code behaves the way it does, however, I am not sure I follow your explanation. Since the regex is missing the //o modifier I would have expected it to get re-compiled on every iteration of the for-loop (please correct me if I am wrong here!). If it doesn't - why not?

    On the other hand, your reasoning is supported by the output of the following code modification:
    my @strings = qw( aaabbbb ab abb aabb aaabb aabbb ); my $a_counter; my $b_counter; for my $string ( @strings ) { print "In $string there were $a_counter 'a's and $b_counter 'b's.\ +n" if ( $string =~ /(a(?{$a_counter ++; } ))+(b(?{$b_counter ++;}))+ +/ ); }
    which produces
    In aaabbbb there were 3 'a's and 4 'b's. In ab there were 4 'a's and 5 'b's. In abb there were 5 'a's and 7 'b's. In aabb there were 7 'a's and 9 'b's. In aaabb there were 10 'a's and 11 'b's. In aabbb there were 12 'a's and 14 'b's.
    So: Can anybody please explain conclusively what is happening here in the compilation of the regex?