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

ファイル内の「1 2 3 4 5」などの数字の箇所を、「1回 2回 3回 4回 5回」のように、「回」をつけた形に変えることを考えています。
以下のようなスクリプトを書きましたが、うまくいきません。

# 「$search_replace」の参照先のテキストファイルの内容
(\d) タブ記号 $1回


EOF

# 問題のスクリプト(一部)
chomp($search_replace);
(my $search, my $replace) = split(/\t/, $search_replace);
$string[$i+1] =~ s/$search/$replace/g; #ここが問題と思われる箇所

ほしい結果は右のとおり。「1回 2回 3回 4回 5回」
現実の結果は右のとおり。「$1回 $1回 $1回 $1回 $1回」

置換文字列の$1の部分がうまく展開(?)できないようです。
どうすればよいか、ご教示ください。

A 回答 (5件)

正規表現の置換部はダブルクォート文字列と同様に評価されるので、次の2つの文は同じように機能します。

質問のケースでは、変数を2重に置き換えなければならないので、明示的にダブルクォートが必要になります。

$string[$i+1] =~ s/$search/$1回/g;
$string[$i+1] =~ s/$search/"$1回"/eg;
    • good
    • 1
この回答へのお礼

なるほど、よくわかりました。
ありがとうございました。

お礼日時:2014/05/23 12:15

>ただ、質問に対する回答としてはズレがあるのではないかと思います。


 と言われても、
>>ファイル内の「1 2 3 4 5」などの数字の箇所を、「1回 2回 3回 4回 5回」のように、「回」をつけた形に変えることを考えています。
 だったらいちいち配列やハッシュに入れる必要はないかと・・

 もうすこし具体的にオリジナルデータ中に、ぽつんと「1\t2\t3\t4\t5」とあるのか、詳しい説明がないと・・

1_挨拶とオリエンテーション
2_カリキュラムの紹介、HTMLとは
・・・とか
    • good
    • 0

次のようにすれば、置き換えられるかも?



$string[$i+1] =~ s/$search/qq(\"$replace\")/eeg;

この回答への補足

ありがとうございました。置換文字列を「式」とみなす(evaluation)ことを2回繰り返しているのですね。ただ、ここでの$replaceが、どのようにして最終的な展開形となるのか、うまく自分の頭のなかで説明できません。qq( ) と、" " がどのように機能している(「"」がエスケープされている理由も含めて)のでしょうか。

補足日時:2014/05/22 17:02
    • good
    • 1
この回答へのお礼

ありがとうございました。無事、動きました。
もしよろしければ、補足入力もご覧いただければと思います。

お礼日時:2014/05/22 17:02

(my $search, my $replace) は2値の配列なのに、元データは??


chomp($search_replace);
my $separator = "\t";
my $newSeparator = "回";
$search_replace =~s/$separator/$newSeparator/g;
print $search_replace,$newSeparator,"\n";


とか
chomp($search_replace);
my $separator = "\t";
my $newSeparator = "回";
my @data = split(/$separator/, $search_replace);
while(<@data>){
print $_,$newSeparator;
}
print "\n";
    • good
    • 0
この回答へのお礼

ありがとうございました。ただ、質問に対する回答としてはズレがあるのではないかと思います。

お礼日時:2014/05/22 17:01

えばる

    • good
    • 0
この回答へのお礼

ありがとうございました。鈍感な私では、それがevaluationのことだとはわかりませんでした。

お礼日時:2014/05/22 17:00

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