Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Re: Extracting the number of repetitions from a regex

by Roy Johnson (Monsignor)
on Dec 18, 2008 at 17:24 UTC ( [id://731328]=note: print w/replies, xml ) Need Help??


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?

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://731328]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others lurking in the Monastery: (7)
As of 2024-03-28 12:31 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found