この広告は、90日以上更新していないブログに表示しています。
Perl は正規表現とか " ではさまれた文字列の中にある変数とか配列を展開してくれるんですが、これは明らかに正規表現の文字クラス ([abc] とか書くヤツ) とブツかるわけです。
以下のコードは @a に 0-999 まで "x" っていう変数をつっこんでから s/$a[...]/y/; 的なことを実行して、 $_ に入ってる x を y に変えようとするコードをいくつか。
#!/usr/bin/env perlfor ($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: y123: x-2: y-22: y-23: xx: yy: x0+1: x$i+1: y+3: x-3: yeoe+eof: xeof+eoe: y
日本語版ラクダ本 p48 によると、
@foo という配列がプログラム中の他の場所で使われているなら、Perl は [bar] がどちらを表わすかを推測するが、ほとんどのケースで適切な判断を下してくれる。
でその注。
推測を行なうアルゴリズムを詳細に説明してみても、退屈なので割愛する。基本的には、文字クラスらしく見えるもの (a-z 、 \w 、先頭の ^) と、式らしく見えるもの (変数や予約語) との加重平均をとって決定する。
アホとしか言えない。感動した。あまりに素敵なので該当するコードを少し探してみたんだけど、相変わらずPerl のコードは難しいなぁとすぐ諦めてしまいました。
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。