http://www.perlmonks.org?node_id=863760


in reply to Re^2: Named Captures
in thread Named Captures

perl -wE"'abcde' =~ m[(?<a>a)|(?<b>b)|(?<c>c)|(?<d>d)|(?<e>e)]g and do +{ say for keys %+ }" a

/g in scalar context matches once, %+ contains the first value, a.

perl -wE"()='abcde' =~ m[(?<a>a)|(?<b>b)|(?<c>c)|(?<d>d)|(?<e>e)]g and + do{ say for keys %+ }" e

/g in list context matches all locations, and after having matched all, %+ contains the result of the last match, e.

perl -wE"my@a = 'abcde' =~ m[(?<a>a)|(?<b>b)|(?<c>c)|(?<d>d)|(?<e>e)]g + and do{ say for keys %+ }" e

Same as above, except that you store the intermediate values.

perl -wE"my@a = 'abcde' =~ m[(?<a>a)|(?<b>b)|(?<c>c)]g and do{ say for + keys %+ }" ## big fat nothing?

You have removed [de] from the matching class. %+ is a global variable and it (seems it) is cleared by the last failing match.

It might or might not be nice to have %+ retain the value(s) of the last successful match, but maybe you can work around this by padding your RE with .*$re.* to convert it into a truely floating RE.