有没有办法修改foreach循环变量?

Fra*_*ank 4 variables perl foreach loops readonly

以下代码给出了一条错误消息:

#!/usr/bin/perl -w

foreach my $var (0, 1, 2){
    $var += 2;
    print "$var\n";
}
Run Code Online (Sandbox Code Playgroud)

Modification of a read-only value attempted at test.pl line 4.

有没有办法修改$var?(我只是好奇地问;看到这个错误信息我真的很惊讶.)

mob*_*mob 12

foreach $var (@list)构造中,$var变为别名的循环元素,在某种意义上,内存地址$var将是与元素相同的地址@list.因此,您的示例代码尝试修改只读值,并获得错误消息.

这个小脚本将演示foreach构造中发生的事情:

my @a = (0,1,2);
print "Before: @a\n";
foreach my $var (@a) {
  $var += 2;
}
print "After:  @a\n";

Before: 0 1 2
After:  2 3 4
Run Code Online (Sandbox Code Playgroud)

附加信息: 此产品perlsyn容易掩饰,但给人的整体瓢:

Foreach循环

...

如果LIST的任何元素是左值,您可以通过修改循环内的VAR来修改它.相反,如果LIST的任何元素不是左值,则任何修改该元素的尝试都将失败.换句话说,"foreach"循环索引变量是您循环的列表中每个项目的隐式别名.


bri*_*foy 5

Perl抱怨的是常量值,而不是循环变量.它抱怨的readonly值是你的0因为$var它是别名,它不存储在变量中(这是你可以改变的).如果循环遍历数组或变量列表,则没有这个问题.