为什么只有其中一个告诉我“尝试修改只读值”?

时间:2012-09-29 01:13:52

标签: perl

此代码运行并生成输出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}

2 个答案:

答案 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

RT#3105


就我而言,有三种for循环:

  • “C风格”(for (my $i=1; $i<4; ++$i)
  • 迭代(for my $i (1,2,3)
  • 计数(for my $i (1..3)