dポイントプレゼントキャンペーン実施中!

とあるソースで
$hogehoge =~ s!<文字列>! do{ $hoge =qq(hogehoge);} !egiox; $_ = $hoge;
というのを見たのですが
$hogehoge =~ s/<文字列>/hogehoeg/egiox;とは何が違うのでしょうか?

また修飾子gとoではどちらが評価されるのでしょうか?または二つとも評価されるのでしょうか?


宜しくお願い致します。

A 回答 (4件)

s/// のオプションである e, g, i, o, x のそれぞれの意味は理解できていますか?


まあ上の書き方が素直だとはあまり思えないが. 結果は
$hoge = qq(hogehoge) if $hogehoge =~ s/<文字列>/hogehoge/egiox; $_ = $hoge;
と同じじゃないかなぁ. 「hogehoge」が (2個じゃなく) 1個ですむってのが「利点」といえば利点だけど....
    • good
    • 0

念の為 s/old/new/egiox において修飾子の意味だけ書くと


・e: new を (文字列そのものではなく) eval した結果で置き換える (e が複数個あればその回数だけ eval を繰り返す)
・g: old にマッチする全ての場所で置換を実行する
・i: old の大文字/小文字を無視する
・o: old を最初にこの部分を実行した 1回だけ評価する
・x: old に空白とコメントを許す
くらいでしょうか. だから,
s/<文字列>/hogehoge/egiox
だと「hogehoge を eval した結果」で置き換えます (hogehoge というサブルーチンがなければエラーになる).
    • good
    • 0

「o修飾子⇒一回評価」というのはある意味正しいんだけど, 「修飾子gとoではどちらが評価されるのでしょうか?」という質問が出るということはおそらく「何を」 1回評価するのかについて誤解している.



たとえば
sub replace {
my ($target, $pattern, $replace) = @_;
$target =~ s/$pattern/$replace/;
}

my %replaces = (hoge => 'foo', ge => 'bar');
for my $pattern (keys %patterns) {
print qq("replace '$pattern' in 'hogehoge' by '$patterns{$pattern}': ), replace("hogehoge", $pattern, $patterns{$pattern}), "\n";
}
で s に o をつけた場合とつけない場合の違いを比較してほしい. でもって, 違いが分かれば「修飾子gとoではどちらが評価されるのでしょうか?」という疑問が無意味であることが理解できるかもしれない.

もちろん Perl のマニュアルには (あんまり「きちんと」って感じじゃないけど) 書いてある.
    • good
    • 0
この回答へのお礼

ありがとうございます・
完全に勘違いしてました。

お礼日時:2010/12/16 00:20

あ, しまった. 「hogehoge」の内容にもよるけど, 本当に


$hogehoge =~ s!<文字列>! do{ $hoge =qq(hogehoge);} !egiox; $_ = $hoge;
の通りなら #1 の
$hoge = qq(hogehoge) if $hogehoge =~ s/<文字列>/hogehoge/egiox; $_ = $hoge;

$hoge = qq(hogehoge) if $hogehoge =~ s/<文字列>/hogehoge/giox; $_ = $hoge;
の間違い.

hogehoge に変数の参照があると別の話になる.
    • good
    • 0
この回答へのお礼

ありがとうございます。
o修飾子⇒一回評価ではないのでしょうか?

お礼日時:2010/12/15 15:25

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