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; }
In reply to Re: unexpected: inside sub($1,$2) if do // then arguments will be changed
by ikegami
in thread unexpected: inside sub($1,$2) if do // then arguments will be changed
by bdimych
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |