• ベストアンサー

正規表現の o

Perl正規表現の =~ s/aaa/g の g が o だったのを見たことがあります。 o はどういう意味なんですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.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」つけていると、後で機能拡張したときに  なんでバグってんのか見つけにくいエラーが潜んでしまいますね) あとは、実際に使って動きを確認して行けばわかることです。

A__
質問者

お礼

ありがとうございます。 o を使うととても変わった動作になるんですね。 スースを書いてもらえたのでよく分かりました。

その他の回答 (1)

  • yuizuian
  • ベストアンサー率42% (103/245)
回答No.1

正規表現…というか、マッチングですね。 えぇと、私もあまり詳しくなくて申し訳ないのですが、 aaaの部分が正規表現で書かれていた場合、それを1度だけ展開するそうです。

A__
質問者

お礼

ありがとうございます。 昔、1回だけ見た記憶があったんだけど o というはやっぱり存在していたんですね。

関連するQ&A