- ベストアンサー
Perlの文字列置換について
とあるソースで $hogehoge =~ s!<文字列>! do{ $hoge =qq(hogehoge);} !egiox; $_ = $hoge; というのを見たのですが $hogehoge =~ s/<文字列>/hogehoeg/egiox;とは何が違うのでしょうか? また修飾子gとoではどちらが評価されるのでしょうか?または二つとも評価されるのでしょうか? 宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
s/// のオプションである e, g, i, o, x のそれぞれの意味は理解できていますか? まあ上の書き方が素直だとはあまり思えないが. 結果は $hoge = qq(hogehoge) if $hogehoge =~ s/<文字列>/hogehoge/egiox; $_ = $hoge; と同じじゃないかなぁ. 「hogehoge」が (2個じゃなく) 1個ですむってのが「利点」といえば利点だけど....
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
念の為 s/old/new/egiox において修飾子の意味だけ書くと ・e: new を (文字列そのものではなく) eval した結果で置き換える (e が複数個あればその回数だけ eval を繰り返す) ・g: old にマッチする全ての場所で置換を実行する ・i: old の大文字/小文字を無視する ・o: old を最初にこの部分を実行した 1回だけ評価する ・x: old に空白とコメントを許す くらいでしょうか. だから, s/<文字列>/hogehoge/egiox だと「hogehoge を eval した結果」で置き換えます (hogehoge というサブルーチンがなければエラーになる).
- Tacosan
- ベストアンサー率23% (3656/15482)
「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 のマニュアルには (あんまり「きちんと」って感じじゃないけど) 書いてある.
- Tacosan
- ベストアンサー率23% (3656/15482)
あ, しまった. 「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 に変数の参照があると別の話になる.
お礼
ありがとうございます。 o修飾子⇒一回評価ではないのでしょうか?
お礼
ありがとうございます・ 完全に勘違いしてました。