Translate

2008年7月6日日曜日

正規表現メモ ?:

正規表現で、javaにもjavascriptにもマッチさせたい場合
/java(script)?/と書けばよいわけだけど
括弧を使うと自動的に$1にメモリされる。

$_ = "javascript";
print "\$1=$1\n" if(/java(script)?/);


この場合
$1=script
と表示される。

でも、この手のシチュエーションで括弧内の
情報が知れると嬉しいなんてことはまずない。
つまり、使いもしないのに$1としてメモリを消費したことになる。
この無駄なメモリ消費を回避するにはどうすればよいかと言うと
最初の括弧の後に?:(クエスチョンマークとコロン)を並べるとメモリしなくなるそうな。

試してみる。
$_ = "javascript";
print "\$1=$1\n" if(/java(?:script)?/);
print "\$
1=$1\n" if(/java(script)?/);


実行結果


確かにメモリされてないですね。
コードが短けりゃ、このわずかなメモリ消費なんて気にする必要はないでしょうし
コードが長けりゃ、どこかしらに正規表現を使っていて$1等で呼び出しを一度でも
していれば、?:なんて記述はする意味がないのかなぁー
と思ってみたり。

EffectivePerlを見る限りだと相当時間にシビアな時に使うみたいですねぇ。
頭の片隅に入れときましょ。

0 件のコメント: