- ベストアンサー
正規表現の o
Perl正規表現の =~ s/aaa/g の g が o だったのを見たことがあります。 o はどういう意味なんですか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ああ、それは、変数部分の展開を一度しか行わないということです。 例を出してみましょうか。 ############################# foreach(0..20) { if ($_=~/$_/) { print "Match\n"; } else { print "No Match\n"; } } ############################# このようにすれば、当然20回 Match とでるでしょう。 なぜなら、$_の中に$_の中身が含まれているのは、理の当然だからです。 しかし、 ############################# foreach(0..20) { if ($_=~/$_/o) { print "Match\n"; } else { print "No Match\n"; } } ############################# こうすると、0回目、10回目、20回目だけがMatchして、 あとはNo Matchとでます。 これは、はじめのマッチングで$_が0として展開され、以後 これを使いつづけるのです。 10回目、20回目でMatchと出ているのは、はじめの「0」という文字が 「10」と「20」という文字列に含まれているからですね。 このような変数の中身を固定化してしまう機能があるのは、 スピードアップのためです。 (まぁインタプリタであるPerl言語でスピードアップして どの程度意味があるのかという根本的な問題はありますが。。。) 今回の様な例では、変数の中身が変わってしまうため、 期待しない結果となってしまいますが、該当のマッチング処理の際に 変数の中身が変わらないことがわかっている(例えば、マッチングの間 はずっと $_ は "ABC"である、など)のであれば、「o」オプションを つけることでスピードがアップするというわけです。 (まぁ、本当にごくごくわずかですけれど。。。 むしろやたらめったら「o」つけていると、後で機能拡張したときに なんでバグってんのか見つけにくいエラーが潜んでしまいますね) あとは、実際に使って動きを確認して行けばわかることです。
その他の回答 (1)
- yuizuian
- ベストアンサー率42% (103/245)
正規表現…というか、マッチングですね。 えぇと、私もあまり詳しくなくて申し訳ないのですが、 aaaの部分が正規表現で書かれていた場合、それを1度だけ展開するそうです。
お礼
ありがとうございます。 昔、1回だけ見た記憶があったんだけど o というはやっぱり存在していたんですね。
お礼
ありがとうございます。 o を使うととても変わった動作になるんですね。 スースを書いてもらえたのでよく分かりました。