perlvar says "read-only and dynamically scoped"
They are. mysub does indeed back them up on entry and restore them on exit.
$ perl -E'
sub f { say $1; "b"=~/(b)/; say $1; }
"a"=~/(a)/;
say $1; f(); say $1;
'
a
a
b
a
The problem is that $_[0] and $_[1] are aliased to $1 and $2, so changing $1 and $2 changes $_[0] and $_[1].
$ perl -E'
sub f { say $_[0]; "b"=~/(b)/; say $_[0]; }
"a"=~/(a)/; f($1);
'
a
b
Three solutions:
-
/.../;
mysub("$1", "$2");
sub mysub {
/.../;
shift;
shift;
}
-
my ($x, $y) =~ /.../;
mysub($x, $y);
sub mysub {
/.../;
shift;
shift;
}
-
/.../;
mysub($1, $2);
sub mysub {
my ($x, $y) = @_;
/.../;
$x;
$y;
}