Beefy Boxes and Bandwidth Generously Provided by pair Networks Cowboy Neal with Hat
"be consistent"
 
PerlMonks  

Re: Named Captures

by JavaFan (Canon)
on Oct 06, 2010 at 11:03 UTC ( #863755=note: print w/ replies, xml ) Need Help??


in reply to Named Captures

Because you performed m//g in scalar context.

Note that if you had done the match in list context, again only one key in %+ would be set ("d" in that case). After all, you wouldn't expect $16 to be set either, would you?


Comment on Re: Named Captures
Re^2: Named Captures
by BrowserUk (Pope) on Oct 06, 2010 at 11:15 UTC

    Okay. What is going on here then?

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

    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      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.

        Okay. That begins to make sense ;)

        But, I discovered that I can get (sort of) what I was after by switching to %-

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

        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others chilling in the Monastery: (7)
As of 2014-04-21 05:55 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (491 votes), past polls