Perl の .. 演算子の面白い現象を発見してみる修行
Perl の .. 演算子で面白い現象を発見した。なんでこうなるのか考察する価値あり。ってソース読めばいいのかも。
スカラコンテキストでの .. 演算子は、リセット機能つきのカウンタとして使えるわけだが ...
そのまま print してみたら、
$ perl -e 'print "$_ [",/3/../7/,"]\n" for 10..40' 10 [0] 11 [0] 12 [0] 13 [] 14 [0] 15 [0] 16 [0] 17 [01] 18 [0] 19 [0] 20 [0] 21 [0] 22 [0] 23 [] 24 [0] 25 [0] 26 [0] 27 [01] 28 [0] 29 [0] 30 [] 31 [] 32 [] 33 [] 34 [] 35 [] 36 [] 37 [1] 38 [] 39 [] 40 [0]
前条件がマッチしないときに 0、マッチしたときに空文字になっているっぽい。後条件がマッチしたときには 1 がつくっぽい。でも、
$ perl -e 'print "$_ [",/3/../7/+1,"]\n" for 10..40'
としてみたら、少し様子がわかった。リストコンテキストだったわけだね。$" いじってないのに要素間に空白が入らないのはなぜ? とも思ったが、そもそも $" はダブルクオーテーション内でリストを展開した場合にしか関係ないのか。
次。こっちのほうが驚いた。
一旦代入した場合は、普通にカウントアップしていくのかと思いきや、
$ perl -e 'print "$_ [",$a=/3/../7/,"]\n" for 10..40' 10 [] 11 [] 12 [] 13 [1] 14 [2] 15 [3] 16 [4] 17 [5E0] 18 [] 19 [] 20 [] 21 [] 22 [] 23 [1] 24 [2] 25 [3] 26 [4] 27 [5E0] 28 [] 29 [] 30 [1] 31 [2] 32 [3] 33 [4] 34 [5] 35 [6] 36 [7] 37 [8E0] 38 [1] 39 [2] 40 [3]
最後だけ E0 がついてる。数値として解釈してしまうと気づかない。
$ perl -e 'print "$_ [",scalar(/3/../7/),"]\n" for 10..40'
としても同様。
面白いことを知った。けど、何の役に立つのだろう。
追記
おっと、E0 の件はここにもちゃんと書いてあった。