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 の件はここにもちゃんと書いてあった。