2

別の質問を見ていて気づきました...

次のようなスクリプトがあるとします。

while (<>) {
  print if 5 .. undef;
}

行 1..4 をスキップして、ファイルの残りを出力します。ただし、これを試してみると:

my $start_line = 5;
while (<>) {
  print if $start_line .. undef;
}

1行目から印刷されます。理由を説明できる人はいますか?

実際、なぜ最初のものが機能するのかさえわかりません。

うーん、これをさらに調べてみると、これが機能することがわかりました。

my $start = 5;
while (<>) {
  print if $. ==  $start .. undef;
}

したがって、最初のバージョンでは魔法のよう$.に行番号が使用されます。しかし、変数で失敗する理由がわかりません。

4

1 に答える 1

10

フリップフロップでの裸の数値の使用は、ライン カウント変数 に対するテストとして扱われます$.。からperldoc perlop:

scalar のいずれかのオペランドが".."定数==である場合、そのオペランドが現在の入力行番号 ($.変数)と等しい ( ) 場合、そのオペランドは true と見なされます。

そう

print if 5 .. undef;

次の「省略形」です。

print if $. == 5 .. undef;

スカラー変数は定数式ではないため、同じことは当てはまりません。これが、に対してテストされていない理由$.です。

于 2014-06-08T11:37:11.407 に答える