Coincidentally, my local 'mongers group is discussing a very similar
situation. So far, I'm not satisfied with perlre's explanation of how
numbered variables are scoped, and the real situation seems to be
confusing, too.
I started by forgetting an if (/whatever/) around my print, and wrote this:
$ echo -e "9 \n \n 2" | perl -ne'/(\d+)/; print "$1 ";'
This has the following result:
9 9 2
...instead of "9 2" as I'd originally expected. OK, $1 is set to the
last successful value. I can deal with that. The weird part is what
happens under -p instead, and when you look at both after deparsing.
Deparsing this gives:
LINE: while (defined($_ = <ARGV>)) {
/(\d+)/;
print "$1 ";
}
Changing my code from -n to -p :
$ echo -e "9 \n \n 2" | perl -pe'/(\d+)/; print "$1 ";'
prints as if $1 were reset to undef on non-match:
9 9
2 2
This code deparses as:
LINE: while (defined($_ = <ARGV>)) {
/(\d+)/;
print "$1 ";
}
continue {
print $_;
}
If I use this code, commenting out the 'print $_;', I get the answer
I'd originally expected:
$ cat testperl.pl
LINE: while (defined($_ = <ARGV>)) {
/(\d+)/;
print "$1 ";
}
continue {
# print $_;
}
$ echo -e "9 \n \n 2"| perl testperl.pl
9 2
Can anybody tell me why?
-Daniel
--
http://kw.pm.org/ - Kitchener-Waterloo Perl Mongers - [EMAIL PROTECTED]
http://coder.com/ - Prescient Code Solutions - (519) 575-3733 [EMAIL PROTECTED]
On Wed, 21 Jul 2004 13:04:25 -0400, Tolkin, Steve <[EMAIL PROTECTED]> wrote:
> OK, here is the answer:
> http://www.perldoc.com/perl5.6.1/pod/perlre.html says:
> The numbered variables ($1, $2, $3, etc.) and the related punctuation
> set ($+, $&, $`, and $') are all dynamically scoped until the end of the
> enclosing block or until the next successful match, whichever comes
> first.
>
> and 5.8.4 is the same except adding $^N (whatever that is).
>
> So it is not possible in Perl 5.
>
> Note that these numbered variables are somewhat like
> global variables, and go do "action at a distance".
>
> Is there going to be a way in perl 6 to control this better?
>
>
> Steve
>
>
>
> -----Original Message-----
> From: Greg London [mailto:[EMAIL PROTECTED]
> Sent: Wednesday, July 21, 2004 12:30 PM
> To: Tolkin, Steve
> Cc: [EMAIL PROTECTED]
> Subject: RE: [Boston.pm] I want a 'compile time' check on missing parens
> in regex
>
> Tolkin, Steve said:
> > What is the scope of $1 and when does it get reset?
>
> here's a start:
> http://www.greglondon.com/iperl/html/iperl.html#20_5_2_Capturing_parenth
> eses_not_capturing
>
> I suppose I should make a note to include some s/// examples...
>
> note to self: self, add some s/// examples.
>
> --
> "Impatient Perl"
> A GNU-FDL training manual for the hyperactive.
> Free HTML/PDF downloads at greglondon.com/iperl
> Paperback/coilbound available for $8.50+s&h
>
> _______________________________________________
> Boston-pm mailing list
> [EMAIL PROTECTED]
> http://mail.pm.org/mailman/listinfo/boston-pm
>
_______________________________________________
Boston-pm mailing list
[EMAIL PROTECTED]
http://mail.pm.org/mailman/listinfo/boston-pm