なるほどメモ!結城さんのところで発見
範囲演算子

スカラコンテキストで使われたときには、".." はブール値を返します。この演算子は、フリップフロップのように 2 値安定で、sedawk や多くのエディタでの行範囲 (コンマ) 演算子をエミュレートするものとなります。各々の ".." 演算子がそれぞれに独立して自分のブール状態を管理します。はじめは、左被演算子が偽である間、演算全体も偽となっています。範囲演算子は、いったん左被演算子が真になると、右被演算子が真である間、真を返すようになります。右被演算子が偽になると、演算子も偽を返すようになります。(次に範囲演算子が評価されるまでは、偽とはなりません。(awk でのように) 真となった、その評価の中で右被演算子をテストし、偽とすることができますが、1 度は真を返すことになります。(sed でのように) 次に評価されるまで、右被演算子をテストしたくなければ、2 個のドットの代わりに 3 つのドット ("...") を使ってください。右被演算子は、演算子の状態が「偽」である間は評価されることがなく、左被演算子は、演算子の状態が「真」である間は評価されることがありません。優先順位は、|| と && の少し下です。偽としては空文字列が返され、真としては (1 から始まる) 順に並んだ数値が返されます。この通し番号は、新たに範囲が始まるごとにリセットされます。範囲の最後の数字には、文字列 "E0" がお尻につけられます。これは、数値としては何の影響もありませんが、範囲の終わりで何か特別なことをしたい場合に、目印として使うことができます。範囲の始まりで何かしたい場合には、通し番号が 1 よりも大きくなるのを待っていればよいでしょう。スカラの ".." の被演算子が数値リテラルであるときは、その被演算子は暗黙に、変数 $. (現行番号)と比較されることになります。例:

スカラ演算子として:

if (101 .. 200) { print; } # 101 行目から 200 行目を印字
next line if (1 .. /^$/); # ヘッダをスキップし、
s/^/> / if (/^$/ .. eof()); # 本文を引用する。