此代码运行并生成输出abc
:
for(10..12){$_=sprintf"%x",$_;print}
但是这段代码因Modification of a read-only value attempted at ...
错误而死:
for(10,11,12){$_=sprintf"%x",$_;print}
为什么这些结构的处理方式不同?
(此代码也有效:)
for(10..10,11..11,12..12){$_=sprintf"%x",$_;print}
答案 0 :(得分:12)
可能是因为当您foreach
超出范围时,“计数循环”优化会发挥作用。 for (1, 2, 3, 4)
实际上构造了包含那些特定只读值的列表(1,2,3,4),但for (1..4)
没有;它只是从范围的开始到结束迭代,依次给出$_
每个连续的值,我猜没有人认为当你尝试分配给$_
那时匹配行为是值得的密切。
答案 1 :(得分:2)
你的最后一个片段正在做一些不应该做的事情。最好用以下代码进行演示:
for (1..2) {
for (1..3, 5..7) {
print $_++;
}
print "\n";
}
输出:
123567
234678
就我而言,有三种for循环:
for (my $i=1; $i<4; ++$i)
)for my $i (1,2,3)
)for my $i (1..3)
)