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と関連する良く見られている質問

Qperlの配列操作について、@array =~ s/AAA//g;を行いたい

perlの配列から、AAAを削除したい場合、どのようにすればよいでしょうか?
例えば、
@array = ('aAAAa','aa','bAAAa');
とある場合、
@array = ('aa','aa','ba');
としたい場合です。

イメージ的には、
@array =~ s/AAA//g;
としたいのですが、うまく動作しません。
ご存知の方教えていただけないでしょうか?
宜しくお願い致します。

Aベストアンサー

@array = map { s/AAA//g; $_; } @array;

QPerlの初歩の初歩の初歩(#!/usr/local/bin/perlについて)

いつもお世話になっています。
Perlを勉強し始めて1か月たっていない人間です。
調べてもよく分からず、気持ち悪いので
どうか教えてください。

Perlで記述するとき1行目にperlへのパスを書きますが
プロバイダでのパスは「#!/usr/local/bin/perl」です。
私のPC環境では「#!d:/perl/bin/perl」になります。

ある日、PC環境で動作検証するとき
間違ってプロバイダのパスのほうを記述してしまいました。
しかし、それでもPC上で動作しました。

なぜパスが違うのに動作するのでしょうか?

なお、わけの分からないまま
「Perlへのパスを通す」というのを昔
やったことがあります。関係がありますか?

ある場合、それをすると
「#!d:/perl/bin/perl」の「d:/perl/」の部分が
「/usr/local/」と同になるということなのでしょうか?

Aベストアンサー

httpdの種類や設定によっては1行目のパスを無視して動作させることが出来ます。
例えばAnHTTPDは最初からcgiの拡張子とperlを関連付けて使う仕様だった気がします。
Apache1.3(Win)もWindowsのOSでcgi拡張子とPerl.exeの関連付けがしてあれば動作させることが出来ます。

Q/usr/local/bin/perl の発音

あまりにも初歩の質問かもしれませんが、
/usr/local/bin/perl
・・・を、声に出すとすると、
/ユーザー/ローカル/ビン/パール
・・・で、良いのでしょうか?

Aベストアンサー

新版 UNIX 由来/読み方辞書
http://x68000.q-e-d.net/~68user/unix/unix-term-dic.html

Q#!/usr/local/bin/perlとしたい

WindowsXP上でCGIを動作させる環境を構築しています。
しかし、サーバにアップロードする際にいちいちPerlパスを変更するのが
面倒なので、「#!/usr/local/bin/perl」と、基本的なディレクトリ指定にしたいです。
(サーバそうでなければ結局指定し直しですが)
現在、「#!c:/perl/bin/Perl」で動かしています。

どうすれば出来るでしょうか?ご教示願います。
ちなみにApacheは2.0.55です。

Aベストアンサー

c:/usr/local/bin/perl.exe
となるようにしてください。

Q複数のperlの正規表現をひとつにまとめるには。

こんにちわ。perlの正規表現について教えてください。

unless ($a =~ /[0-9]/){
&err1('数字をいれてください');
}

unless ($b =~ /[0-9]/){
&err1('数字をいれてください'');
}

unless ($c =~ /[0-9]/){
&err1('数字をいれてください'');



上の3つのunless文は$a,$b,$c以外はすべて同じなのでこれをひとつにしたいのですが、どうやって記述すべきでしょうか?($a,$b,$c=~ /[0-9]/)とか($a =~ /[0-9]/ or $b =~ /[0-9]/ or $c =~ /[0-9]/)ってやってみてもだめでした^^教えてください。

Aベストアンサー

とりあえず
if ($a !~ /[0-9]/ || $b !~ /[0-9]/ || $c !~ /[0-9]/){
&err1('数字をいれてください');
}
でいいですが
ループにして
foreach $x (($a, $b, $c)){
if($x !~ /[0-9]/){
&err1('数字をいれてください');
last;
}
}
とかでもいいと思います


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

おすすめ情報