Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re: What's happening to my $1?

by blokhead (Monsignor)
on Jan 20, 2004 at 20:49 UTC ( [id://322703]=note: print w/replies, xml ) Need Help??


in reply to What's happening to my $1?

You are trying to use $1 after a failing match, so basically you deserve whatever's coming to you ;) The contents of the ${\d+} variables are only well-defined if the last (capturing) match was successful. The fact that you were getting the old value was lucky. You should just save $1 after a successful match if you will need it later:
my $last_match; while ( <DATA> ) { if ( /^([A-Z]+)$/ ) { print "In if: $1\n"; $last_match = $1; } else { print "In else: $last_match\n"; } } __DATA__ FOO 1234 Xyz BAR DFgdfg
This produces the output you want.

Speculation: As for why it's doing this, I have a guess that as the regex engine goes left to right across the string, it starts matching and filling up the buffer for $1 with uppercase characters, clobbering what was in it before. It doesn't fail until it gets to a lowercase character (when the regex is expecting the end of string), but $1 is already trashed. When the non-matching strings in your __DATA__ started with lowercase letters, the regex could fail before even trying to fill the buffer for $1, so it was not clobbered and the old value remained.

Why you still ended up getting exactly the old first character though is a mystery to me.

blokhead

Replies are listed 'Best First'.
Re: Re: What's happening to my $1?
by Not_a_Number (Prior) on Jan 20, 2004 at 22:23 UTC
    You are trying to use $1 after a failing match, so basically you deserve whatever's coming to you ;)

    Thanks, blokhead. That's more or less what I'd intuited. But, in that case:

    1) Why doesn't the 'failing match' clobber $1 in my first two snippets?

    2) With respect to the docs:

    The numbered variables ($1, $2, $3, etc.) ... are all dynamically scoped until the end of the enclosing block or until the next successful match, whichever comes first.

    This seems to suggest that $1 (provided that it stays in scope) should not change until a match succeeds, rather than being clobbered if a match fails (which, I'm sure you'll agree, is not the same thing...).

    Why you still ended up getting exactly the old first character though is a mystery to me.

    To me too...

    Still Confused,

    dave

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others avoiding work at the Monastery: (2)
As of 2024-04-26 02:50 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found