正規表現の文字クラス
Perl は正規表現とか " ではさまれた文字列の中にある変数とか配列を展開してくれるんですが、これは明らかに正規表現の文字クラス ([abc] とか書くヤツ) とブツかるわけです。
以下のコードは @a に 0-999 まで "x" っていう変数をつっこんでから s/$a[...]/y/; 的なことを実行して、 $_ に入ってる x を y に変えようとするコードをいくつか。
#!/usr/bin/env perl for ($i=0; $i < 999; $i++) { $a[$i] = "x"; } $_ = "x"; s/$a[12]/y/; print "12: $_\n"; $_ = "x"; s/$a[123]/y/; print "123: $_\n"; $_ = "x"; s/$a[-2]/y/; print "-2: $_\n"; $_ = "x"; s/$a[-22]/y/; print "-22: $_\n"; $_ = "x"; s/$a[-23]/y/; print "-23: $_\n"; $_ = "x"; s/$a[x]/y/; print "x: $_\n"; $_ = "x"; s/$a[y]/y/; print "y: $_\n"; $_ = "x"; s/$a[0+1]/y/; print "0+1: $_\n"; $_ = "x"; $i = 0; s/$a[$i+1]/y/; print "\$i+1: $_\n"; $_ = "x"; s/$a[+3]/y/; print "+3: $_\n"; $_ = "x"; s/$a[-3]/y/; print "-3: $_\n"; $_ = "x"; s/$a[eoe+eof]/y/; print "eoe+eof: $_\n"; $_ = "x"; s/$a[eof+eoe]/y/; print "eof+eoe: $_\n";
これ全部の実行結果を当てられたらそうとうえらいです。以下答え。
12: y 123: x -2: y -22: y -23: x x: y y: x 0+1: x $i+1: y +3: x -3: y eoe+eof: x eof+eoe: y
日本語版ラクダ本 p48 によると、
@foo という配列がプログラム中の他の場所で使われているなら、 Perl は [bar] がどちらを表わすかを推測するが、ほとんどのケースで適切な判断を下してくれる。
でその注。
推測を行なうアルゴリズムを詳細に説明してみても、退屈なので割愛する。基本的には、文字クラスらしく見えるもの (a-z 、 \w 、先頭の ^) と、式らしく見えるもの (変数や予約語) との加重平均をとって決定する。
アホとしか言えない。感動した。あまりに素敵なので該当するコードを少し探してみたんだけど、相変わらず Perl のコードは難しいなぁとすぐ諦めてしまいました。