11

このコードが実行され、出力が生成されます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}
4

2 に答える 2

13

おそらくforeach、範囲を超えたときに機能する「カウントループ」の最適化が原因です。for (1, 2, 3, 4)実際には、これらの特定の読み取り専用値を含むリスト(1、2、3、4)を作成しますが、作成for (1..4)しません。範囲の最初から最後まで繰り返し、連続する各値を順番に与えます。それに密接$_に割り当てようとすると、動作を一致させる価値があるとは誰も考えていなかったと思います。$_

于 2012-09-29T01:19:09.920 に答える
2

最後のスニペットは、すべきでないことを実行しています。次のコードで最もよく示されます。

for (1..2) {
   for (1..3, 5..7) {
      print $_++;
   }
   print "\n";
}

出力:

123567
234678

RT#3105


私に関する限り、forループには次の3種類があります。

  • 「Cスタイル」(for (my $i=1; $i<4; ++$i)
  • 反復(for my $i (1,2,3)
  • カウント(for my $i (1..3)
于 2012-10-10T19:27:27.793 に答える