アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。よろしくお願いします。

以下のようなソースで、
指定した文字列があれば置換、という作業を、
配列をループさせて連続して行いたいと思っているのですが、置換されません。
----------------
$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才
---------------------

こんな事ってあるのでしょうか?
何か間違いがありましたら教えて下さい
よろしくお願いします

A 回答 (3件)

オプションの o は、パターンのコンパイルを1度しか行わないようにする指定です。



ループだと $i = 0 の時にパターンがコンパイルされ、以降は
  $str =~ s/<--name-->/$to[$i]/go;
として実行されてしまうため、2回目以降は成功しません。

ループにしない場合は、それぞれの式でパターンがコンパイルされるので、意図通りに動作したのです。
    • good
    • 0
この回答へのお礼

丁寧なご解説、本当にありがとうございます。
良く理解できました。

「Perlのバグだ!」などと騒いでいたのですが、単に自分の勉強不足でした。恥ずかしい限りです。

お礼日時:2004/12/15 16:56

----------------


$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 で確認しました。
何故でしょうねぇ・・
    • good
    • 0
この回答へのお礼

わざわざ試していただいたとのこと、本当にありがとうございます。
原因は下の方が説明して下さった通り、ケアレスミスでした・・お騒がせしまして申し訳ありません。

それにしても、私もXPで動かしているのですが、何故動作結果が違うのでしょうね??不思議です・・。

お礼日時:2004/12/15 16:52

$str=~s/$from[$i]/$to[$i]/g;



みたいです・・
    • good
    • 0
この回答へのお礼

あ、ありがとうございます!!全然気がつきませんでした!
修正したら無事動きました・・・・
こんなおバカな間違いでお騒がせしまして、申し訳ありません・・。

ご回答、本当にありがとうございました。

お礼日時:2004/12/15 16:46

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