以下代码给出了错误消息:
#!/usr/bin/perl -w
foreach my $var (0, 1, 2){
$var += 2;
print "$var\n";
}
Modification of a read-only value attempted at test.pl line 4.
有没有办法修改$var
? (我只是想出于好奇心;看到这个错误信息我真的很惊讶。)
答案 0 :(得分:12)
在foreach $var (@list)
构造中,$var
变为别名的循环元素,因为$var
的内存地址与@list
的元素的地址相同1}}。因此,您的示例代码尝试修改只读值,并收到错误消息。
这个小脚本将演示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
来自This item的其他信息 perlsyn
很容易被掩盖,但却提供了整个独家新闻:
Foreach循环
...
如果LIST的任何元素是左值, 您可以通过修改VAR来修改它 在循环内。相反,如果有的话 LIST的元素不是左值,任何 尝试修改该元素 失败。换句话说,“foreach” 循环索引变量是隐式的 列表中每个项目的别名 你正在循环。
答案 1 :(得分:5)
Perl抱怨的是常量值,而不是循环变量。它抱怨的只读值是0
,因为$var
是它的别名,并且它不存储在变量中(这是您可以更改的内容)。如果循环遍历数组或变量列表,则没有这个问题。
答案 2 :(得分:4)
弄清楚为什么以下内容不会产生相同的消息将大大提高您对消息首先发布的原因的理解:
#!/usr/bin/perl
use strict;
use warnings;
for my $x ( @{[ 0, 1, 2 ]} ) {
$x += 2;
print $x, "\n";
}