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

このQ&Aに関連する最新のQ&A

A 回答 (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」つけていると、後で機能拡張したときに
 なんでバグってんのか見つけにくいエラーが潜んでしまいますね)

あとは、実際に使って動きを確認して行けばわかることです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/10/06 22:46

正規表現…というか、マッチングですね。


えぇと、私もあまり詳しくなくて申し訳ないのですが、
aaaの部分が正規表現で書かれていた場合、それを1度だけ展開するそうです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/10/06 22:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このカテゴリの人気Q&Aランキング