Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re: Extracting the number of repetitions from a regex

by Roy Johnson (Monsignor)
on Dec 18, 2008 at 17:24 UTC ( #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.


Comment on Re: Extracting the number of repetitions from a regex
Download Code
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
Node Status?
node history
Node Type: note [id://731328]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (6)
As of 2015-07-29 01:07 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (260 votes), past polls