http://www.perlmonks.org?node_id=680796
prasadbabu has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks,
Today when I was studying Perl 5.10 regex, I came across following problem.
When I matched the capture pattern in named variable, I printed it after substitution, but it was not printing. when I print the same immediately after the expression, it works. Where am I going wrong? So can't we use the %+ anywhere in program, just like normal hash?

use feature 'say'; $test = 'abc1234asf'; $test =~ /(?<one>\w{4})(?<two>\w{4})/; #say 'one:', $+{one}; #works #say 'two:', $+{two}; $test =~ s/(?<three>\w{4})(?<four>\w{4})/$+{four}$+{three}/; say 'one:', $+{one}; #NOT works say 'two:', $+{two}; say; say 'three:', $+{three}; say 'four:', $+{four}; say; say 'output:', $test; OUTPUT: ------- one: two: three:abc1 four:234a output:234aabc1sf

Thanks in advance

Prasad

Replies are listed 'Best First'.
Re: Perl 5.10 Regex - Named capture variables
by kyle (Abbot) on Apr 16, 2008 at 13:57 UTC

    This is the behavior that I'd expect. Specifically, %+ gets cleared before each regexp execution, so any matches you got before will not be carried over. This is equally true of capture variables $1, $2, etc.

Re: Perl 5.10 Regex - Named capture variables
by moritz (Cardinal) on Apr 16, 2008 at 13:58 UTC
    %+ is reset by a pattern match just like @+ and @_ are.

    %+ isn't a normal hash either, it's magically tied to the regex engine ;-)