加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl foreach循环子程序

发布时间:2020-12-16 06:28:10 所属栏目:大数据 来源:网络整理
导读:我知道perl中的子程序通过引用传递arg.但是在下面的代码中,子例程中的foreach循环不应该更改@list的值,因为my $i应该创建一个新的词法范围var $i.对$i的任何赋值都应该是词法范围,但不能更改@list值. 任何人都可以解释在foreach循环中发生的事情导致值更改为
我知道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";

输出:

2 2 4 4

解决方法

由于 foreach特征,$i被别名化为@_数组的元素(并且@_元素别名为@list的@list元素).

从perldoc

If any element of LIST is an lvalue,you can modify it by modifying VAR inside the loop. Conversely,if any element of LIST is NOT an lvalue,any attempt to modify that element will fail. In other words,the foreach loop index variable is an implicit alias for each item in the list that you’re looping over.

如果你想避免这种行为,不要直接在@_数组上迭代,即.

sub absList {
    my @arr = @_;
    foreach my $i (@arr) {
        $i = abs($i);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读