use*_*829 5 perl foreach subroutine
我知道perl中的子程序通过引用传递arg.但是在下面的代码中,子例程中的foreach循环不应该更改值,@list因为它my $i应该创建一个新的词法范围var $i.任何赋值$i应该是词法范围,但不能改变@list值.
任何人都可以解释在foreach循环中发生的导致值更改的内容@list吗?
sub absList {
foreach my $i (@_) {
$i = abs($i);
}
}
@list = (-2,2,4,-4);
absList(@list);
print "@list";
Run Code Online (Sandbox Code Playgroud)
输出:
2 2 4 4
Run Code Online (Sandbox Code Playgroud)
$i别名为@_数组到期foreach特征的@_元素(并且元素被别名化为@list应有@_ 魔法的元素).
来自perldoc
如果LIST的任何元素是左值,您可以通过修改循环内的VAR来修改它.相反,如果LIST的任何元素不是左值,则任何修改该元素的尝试都将失败.换句话说,foreach循环索引变量是您循环的列表中每个项的隐式别名.
如果你想避免这种行为,不要直接在@_数组上迭代,即.
sub absList {
my @arr = @_;
foreach my $i (@arr) {
$i = abs($i);
}
}
Run Code Online (Sandbox Code Playgroud)