Subscribed unsubscribe Subscribe Subscribe

範囲演算子の使い方

http://naoya.g.hatena.ne.jp/naoya/20061222/1166754815 で言及されている振る舞いについて。
詳しい解説なんかは、上記の記事へのトラックバックエントリを読めばだいたい分かる、はず。
正規表現」というタグをつけているヒトが多いけど、これは正規表現の話というか範囲演算子の振る舞いが焦点だと思う。


"perldoc perlop"の「Range Operators」を参照すること。ここにほぼすべてが書いてある。

範囲演算子".."

  • リストコンテキストで評価される場合(普通はほとんどコレで使われる)は、左辺から右辺までマジカルインクリメントした配列を返す
  • スカラーコンテキストで評価される場合、左辺値と右辺値による2値安定の真偽値を返す
    • 「左オペランドが真になってから、右オペランドが真になるまで」が真、それ以外の間は偽、の状態を維持する
      • それぞれのオペランドに対して真偽値で評価するが、それが定数の場合は暗黙に入力行番号を示す変数"$."と等しいか否かを評価する
      • 偽としては空文字列が返され、真としては1から始まる数値が順に返される
        • 範囲の最後の数字には、文字列"E0"が末尾に付加される

$ perl -le '$.=$_, print "result:".(3..7) for 1..10'
result:
result:
result:1
result:2
result:3
result:4
result:5E0
result:
result:
result:
$ perl -le '$.=ord, print "$_:".(70..80) for A..Z'
A:
B:
C:
D:
E:
F:1
G:2
H:3
I:4
J:5
K:6
L:7
M:8
N:9
O:10
P:11E0
Q:
R:
S:
T:
U:
V:
W:
X:
Y:
Z:

まとめ

なので、冒頭のリンク先の例のような

if /regexp1/ .. /regexp2/

という書き方は、単に範囲演算子が「$_に対してregexp1がマッチしてから、$_に対してregexp2がマッチするまでが真」という評価をしているだけであって、正規表現として特殊な振る舞いをしているわけではない。


まぁ結局この範囲演算子スカラーコンテキストで使うのってこういう場合くらいなんだろうけど。
一応覚えておくと何かのときに役に立つかも?程度に覚えておこう。