範囲指定演算子。コンテキストによって異なる二つの演算を表す。
配列のコンテキストでは、
左の値から右の値まで(1 ずつ)増やした値を持つ配列を返す。
これは for (1..10)
ループや配列の一部を切り出す操作には便利である。
スカラーのコンテキストでは ..
は論理値を返す。
演算子はフリップフロップのように 2 通りの値をとる。
..
はそれぞれが自分だけの論理状態を持っていて、左引数が偽である限り、
偽の値を持つ。いったん左引数が真になると、右引数が真になるまで真である。
その後、範囲指定演算子は再び偽になる。
(次に範囲指定演算子が評価されるまで、偽にはならない。
真になったのと同じ評価を行った時に偽になることがありうるが、
それでも一度は真を返す。)演算子が偽の間は右引数は評価されず、
演算子が真の間は左引数は評価されない。
スカラー ..
演算子はもともと sed や awk にならって
行番号範囲指定をするためのものである。
優先度は ||
や &&
よりも少し低い。返り値は偽ならばヌル文字列、
真ならば(1 から始まる)連続した数字である。
この数字は範囲指定に出会う毎にリセットされる。
範囲の最後の数字には文字列 `E0' がつけられるので、数値に影響はないが、
最後の点を除きたい場合に検索のきっかけとなる。
数字が 1 より大きくなるのを待つことで最初の点を除くことができる。
スカラーの ..
の引数のどちらかの値が静的な場合は、
引数は暗黙のうちに変数 $.
と比較される。
スカラー演算子としては:
if (101 .. 200) { print; } # 200 行出力する
next line if (1 .. /^$/); # ヘッダー行をスキップ
s/^/> / if (/^$/ .. eof()); # 本体を引用する
配列演算子としては:
for (101 .. 200) { print; } # $_ を 100 回出力する
@foo = @foo[$[ .. $#foo]; # 高価なノーオペレーション
@foo = @foo[$#foo-4 .. $#foo]; # 最後の 5 要素を取り出す