What she didn't tell you, is that you can fix this, by adding a block level, putting the s/// in its own block.
which yields:#! perl -w 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 }
Ain't that magic.<Learning Perl ><Schwartz, Randal L ><xxxx>
It's all hidden in that piece of documentation that you quoted:
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.and here, because the s/// has its own block, the $1, $2, $3 also have their own limited scope. Outside that block, the outer values are restored. It is indeed as if there's an implicit local applied to them. So your values, the ones you want to show, got restored to the values your pattern match yielded, ready for you to print them.
In reply to Re: Modifying value of $1 clobbers $2, $3 etc?
by bart
in thread Modifying value of $1 clobbers $2, $3 etc?
by Not_a_Number
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |