Consider the following snippet:
use strict; use warnings; my $str = "Title: Learning Perl Author: Schwartz, Randal L. ISBN: xx +xx"; if ( $str =~ /^Title: (.*)\s+Author: (.*)\s+ISBN: (.*)/ ) { # print "<$1><$2><$3>\n"; my $author = $2; $author =~ s/\.//g; # Remove full stops (periods) print "<$1><$author><$3>"; # Line 8 }
The output I get is:
Use of uninitialized value <snip> line 8. Use of uninitialized value <snip> line 8. <><Schwartz, Randal L ><>
What has happened to $1 and $3?
According to perldoc perlre:
The scope of $<digit> extends to the end of the enclosing BLOCK or eval string, or to the next successful pattern match, whichever comes first.
which I understand to mean that $1 and $3 should still be in scope.
Interestingly, if the substitution fails (ie here if there is no "." in $author to substitute), line 8 works as expected...
Version: AS Perl 5.61 Win ME and XXXX
Please note: I'm not looking for alternative or "better" ways of parsing such a string; I can think of several. My question is only why this way doesn't work.TIA
dave
In reply to Modifying value of $1 clobbers $2, $3 etc? by Not_a_Number
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |