OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

正規表現の o

  • 暇なときにでも
  • 質問No.146605
  • 閲覧数29
  • ありがとう数5
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 59% (194/328)

Perl正規表現の
=~ s/aaa/g
の g が o だったのを見たことがあります。
o はどういう意味なんですか?
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル11

ベストアンサー率 61% (157/255)

ああ、それは、変数部分の展開を一度しか行わないということです。

例を出してみましょうか。
#############################
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__

お礼率 59% (194/328)

ありがとうございます。
o を使うととても変わった動作になるんですね。
スースを書いてもらえたのでよく分かりました。
投稿日時 - 2001-10-06 22:46:24
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル11

ベストアンサー率 42% (103/245)

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

お礼率 59% (194/328)

ありがとうございます。
昔、1回だけ見た記憶があったんだけど
o というはやっぱり存在していたんですね。
投稿日時 - 2001-10-06 22:47:13


このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ