燈明ブログ

現状は小池啓仁の応援ブログ

範囲演算子『..』と『...』の違い?

ここ数日、『..』と『...』が、どう違うのかを悩んでいます。
とりあえず、現状でわかっている範囲演算子について述べてみます。


リストコンテキストでは、超簡単で、範囲のリストを生成します。
例えば、(1 .. 5)は、(1,2,3,4,5)と等価です。


スカラーコンテキストでは、わかっているところを書いてみます。
以下の例では、標準入力からWebページのテキストファイルを読み込んでいます。
そして、1行目から10行目を表示し、また、Webページ内のhtmlのbody要素を表示します。

while (<>) {
    if ( 1 .. 10 ) { print; }
    if ( /<body>/ .. /<\/body>/ ) { print; }
}

範囲は、標準入力のときには、現在の入力行を示す特殊変数『$.』と比較されます。


そして、以下の『"..." と ".."』の違いがわからないのです。
また、その違いは、sedawkコンマ演算子の違いだと書いてあるみたいなのですが、sedawkでテストをしても違わず同じ結果になるのです。

カラコンテキストで使われたときには、".." は真偽値を返します。この演算子は、フリップフロップのように 2 値安定で、 sedawk や多くのエディタでの行範囲 (コンマ) 演算子をエミュレートするものとなります。各々の ".." 演算子がそれぞれに独立して自分の真偽状態を管理します。はじめは、左被演算子が偽である間、演算全体も偽となっています。範囲演算子は、いったん左被演算子が真になると、右被演算子が真である間、真を返すようになります。右被演算子が偽になると、演算子も偽を返すようになります。 (次に範囲演算子が評価されるまでは、偽とはなりません。 (awk でのように) 真となった、その評価の中で右被演算子をテストし、偽とすることができますが、1 度は真を返すことになります。 sed でのように、次に評価されるまで右被演算子をテストしたくなければ、 2 個のドットの代わりに 3 つのドット ("...") を使ってください。その他の点では、"..." は ".." と同様に振舞います.

http://perldoc.jp/docs/perl/5.6.1/perlop.pod


あと、以下のくだりも理解できない。なにを言っているのだろうか・・・。

偽としては空文字列が返され、真としては (1 から始まる) 順に並んだ数値が返されます。この通し番号は、新たに範囲が始まるごとにリセットされます。範囲の最後の数字には、文字列 "E0" がお尻につけられます。これは、数値としては何の影響もありませんが、範囲の終わりで何か特別なことをしたい場合に、目印として使うことができます。範囲の始まりで何かしたい場合には、通し番号が 1 よりも大きくなるのを待っていればよいでしょう。

http://perldoc.jp/docs/perl/5.6.1/perlop.pod

誰か、わかる方、教えてください。