- ベストアンサー
ループで置換がうまく行きません
こんにちは。よろしくお願いします。 以下のようなソースで、 指定した文字列があれば置換、という作業を、 配列をループさせて連続して行いたいと思っているのですが、置換されません。 ---------------- $str = "年齢は<--age-->才"; #置換したい文字列の配列 $from[0] = '<--name-->'; $to[0] = 'やまだ'; $from[1] = '<--age-->'; $to[1] = '10'; $from[2] = '<--date-->'; $to[2] = '今日'; #配列分ループして、ヒットしたら置換する for ($i=0; $i<=2; $i++){ $str=~s/$from[$i]/$to[$i]/go; } print $str; --------------------- 結果:年齢は<--age-->才 --------------------- ところが、全く同じ処理をループせずに行うとうまくいきます。 ------------------- $i = 0; $str=~s/$from[$i]/$to[$i]/go; $i = 1; $str=~s/$from[$i]/$to[$i]/go; $i = 2; $str=~s/$from[$i]/$to[$i]/go; print $str; --------------------- 結果:年齢は10才 --------------------- こんな事ってあるのでしょうか? 何か間違いがありましたら教えて下さい よろしくお願いします
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
オプションの o は、パターンのコンパイルを1度しか行わないようにする指定です。 ループだと $i = 0 の時にパターンがコンパイルされ、以降は $str =~ s/<--name-->/$to[$i]/go; として実行されてしまうため、2回目以降は成功しません。 ループにしない場合は、それぞれの式でパターンがコンパイルされるので、意図通りに動作したのです。
その他の回答 (2)
- arcsin
- ベストアンサー率70% (28/40)
---------------- $str = "年齢は<--age-->才"; #置換したい文字列の配列 $from[0] = '<--name-->'; $to[0] = 'やまだ'; $from[1] = '<--age-->'; $to[1] = '10'; $from[2] = '<--date-->'; $to[2] = '今日'; #配列分ループして、ヒットしたら置換する for ($i=0; $i<=2; $i++){ $str=~s/$from[$i]/$to[$i]/go; } print $str; --------------------- 回答ではないですが、↑の部分をそのままコピペして動作確認したらちゃんとできましたよ~。 当方は winXP で確認しました。 何故でしょうねぇ・・
お礼
わざわざ試していただいたとのこと、本当にありがとうございます。 原因は下の方が説明して下さった通り、ケアレスミスでした・・お騒がせしまして申し訳ありません。 それにしても、私もXPで動かしているのですが、何故動作結果が違うのでしょうね??不思議です・・。
- okiyoshi
- ベストアンサー率34% (11/32)
$str=~s/$from[$i]/$to[$i]/g; みたいです・・
お礼
あ、ありがとうございます!!全然気がつきませんでした! 修正したら無事動きました・・・・ こんなおバカな間違いでお騒がせしまして、申し訳ありません・・。 ご回答、本当にありがとうございました。
お礼
丁寧なご解説、本当にありがとうございます。 良く理解できました。 「Perlのバグだ!」などと騒いでいたのですが、単に自分の勉強不足でした。恥ずかしい限りです。