perl foreach循环子程序

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)

Сух*_*й27 5

$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)

  • @ user2763829如果你使用推荐的`strict`,那么你必须在某处声明`$ i`,perl最佳实践是将每个变量的范围限制为实际使用它的最小块.这导致'foreach my $ i(..)` (2认同)