• ベストアンサー

ループ内での置換方法について

ループ内での置換方法について 以下の内容で置換を行ってみたのですが、書き方が悪いのかうまく取得できません。 $hoge="現在のナンバーは《no》です"; for(1..3){ $hoge=~s/《no》/$_/g; print"$hoge<br>"; } 結果、noの部分は全て1となりました。 私の予定では、1、2、3と順に表示される予定でしたが・・・。 現在のナンバーは1です 現在のナンバーは2です 現在のナンバーは3です と表示されるようにするにはどのように書けばよろしいでしょうか。 どなたか教えていただけませんか。 よろしくお願いします。

  • hana43
  • お礼率49% (105/212)
  • Perl
  • 回答数1
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • taka37777
  • ベストアンサー率30% (166/544)
回答No.1

1回目のループで$hogeの内容は「現在のナンバーは1です」に変わるので、 次にこれを2に変更したいときは、「1」を「2」に置き換える必要があります。 下記のように$hogeの内容を$hoge2に入れて、置換すると表示されます。 ただ置換をせずに表示する場合は、printfを使った方が簡単です。 $hoge="現在のナンバーは《no》です"; for(1..3){ $hoge2=$hoge; $hoge2=~s/《no》/$_/g; print"$hoge2<br>"; } 現在のナンバーは1です<br>現在のナンバーは2です<br>現在のナンバーは3です<br> ----- for(1..3){ printf "現在のナンバーは%dです<br>", $_; } 現在のナンバーは1です<br>現在のナンバーは2です<br>現在のナンバーは3です<br>

hana43
質問者

お礼

丁寧に教えていただきありがとうございました。 教えていただいた事を見ながらじっくり考えたところ、私のやり方がうまくいかない理由が分かったように思います。 実際、教えていただいた通りうまくいきました。 ありがとうございました。

関連するQ&A

  • ループで置換がうまく行きません

    こんにちは。よろしくお願いします。 以下のようなソースで、 指定した文字列があれば置換、という作業を、 配列をループさせて連続して行いたいと思っているのですが、置換されません。 ---------------- $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才 --------------------- こんな事ってあるのでしょうか? 何か間違いがありましたら教えて下さい よろしくお願いします

    • ベストアンサー
    • Perl
  • Perlのs///を使った置換で質問です

    s///のパターンマッチ演算子を使った置換で、 <br>→<br /> に置換するときははどうしたらいいのでしょうか? ↓これでは<br />の/が引っかかってできないようです・・・。 $content =~ s/<br>/<br />/g;

    • ベストアンサー
    • Perl
  • ”ァー”が含まれている文字を置換すると文字化け

    OS:solaris8 perlのver:5.8.6 perlで、”ァー”が含まれている文字列に対し、 全角スペースを半角スペースに置換しようとすると 文字化けしてしまいます。 (”ぁー”でもどうようでした) ”ぃー”や”ぅー”、”ぁ”では 問題無いのですが…。 当方、perl初心者&文字コードに詳しくないため、 原因がよくわからないでいます。 どなたか原因をおわかりの方、 ご教授お願いいたします。 文字コードはEUCです。 以下はソースです my $line = "ファイヴァー スコープ 眼鏡"; $line =~ s/\t/ /g; # タブを半角スペースに置換する print '$line2='.$line."<br>\n"; $line =~ s/ / /g; # 全角スペースを半角スペースに置換する print '$line3='.$line."<br>\n"; #↑ここで文字化けしてしまいます $line =~ s/^\s+//; # 頭の空白を除く print '$line4='.$line."<br>\n"; $line =~ s/\s+$//; # 尻の空白を除く print '$line5='.$line."<br>\n";

    • ベストアンサー
    • Perl
  • 置換コマンド

    freeBSD5.3を使用している初心者です。 あるディレクトリ以下の全ファイルに対し、一度に内容の文字を置換したいのですがうまくいきません。 例えば /hoge/aaa.txt /hoge/bbb.txt /hoge/ccc.txt と、/hoge以下に3ファイルがあり、このファイルにAAAという文字列があるなら、AAAをBBBにしたいと思っています。 sed s/AAA/BBB/g /hoge/* とすると、置換後の中身が表示はされますが、それに置きかわったファイルは/hoge/以下に保存されていません。(もとのAAAのまま) できたら、/hoge 以下の置換されたファイルを/hoge2以下に同じ名前で保存させたいと思っています。 どなたか是非アドバイスお願いいたします。

  • awkのgsubによる置換

    awkのgsubで置換をしているのですが、置換後、全体をprintするため $0で出力したところ、セパレータがカンマ区切りから半角スペースに なってしまいます。 置換されなかった場合は、何事もなくそのまま出力されます。 これは、そのようなものなのでしょうか もし、カンマ区切りで出力したい場合は、ループなどで繰り返して 出す以外ないのでしょうか gawk -F"," '{if ($5=="1") {gsub($2,'abc',$2); print $0} else {print $0}}' hoge.txt

  • 右からループするにはどうすればいいですか?

    Sub test() For Each s In Worksheets Debug.Print s.Name Next End Sub これでシート名を取得する際は左から取得されますが 右からループするにはどうすればいいですか?

  • 配列の値をループ

    よろしくお願いします。 例えば、$ary=array(1,2,3,4,5,6,7); という配列があるとします。この1,2,3,4,5,6,7の値を ループで表現することは可能でしょうか?? for文で試してみましたが、 $hoge="for($i=0;$i<7;$i++){ print $i; }"; $ary=array($hoge); 表示結果 for($i= でした。""で囲んだのでそのまま文字としてなったんだと 思います。""をはずすとエラーになります。 理想の表示結果は当然 1,2,3,4,5,6,7です。 行いたいことの意図はわかっていただけたでしょうか? 可能な場合、どういう記述をすればうまくいくのでしょうか? それとも不可能なのでしょうか?よろしくお願いします。 環境 php4.4.4 apache2 winXP

    • ベストアンサー
    • PHP
  • ループ内での後方参照の使用に関して

    下記のようなプログラムを作成しました。 (Perl のバージョンは 5.8.8 となります。) for ($i=0; $i<=105; $i++) { $str1 = "str1"; $str2 = "1234567890str1test"; $str2=~ s/^(\d+)($str1)/test/g; print $i."\n"; print $1."\n"; print $2."\n"; print $str2."\n"; } このプログラムを実行しますと、ループが100回実施するまでは $1, $2の値を 取得できるのですが、100回を超えると取得できなくなります。 (上記で行っている置換処理は100回を超えても正常に処理されます。) 質問としましては、この現象は Perl のバグなのでしょうか。 それとも、私の正規表現の書き方に不備があるのでしょうか。 ネットでいろいろ調べてみたのですが、答えが見つからなかったため、 質問させていただきました。 よろしくお願い致します。

  • sedでの改行置換

    sedを用いた処理で質問があります。 出力結果の改行を置換して一列として表示しようとしているのですが、どうもうまくいきません。 (perlは敢えて使いません) 例えば、以下のようなファイルがあるとして、 $ cat hoge.txt hoge boo bar この出力結果を加工して、「hoge boo bar」のように、 改行をスペースに置換して一行として表示したい場合は、どのようにすれば良いでしょうか? ちなみに、以下のような使い方だと、うまくいきませんでした。 $ cat hoge.txt | sed 's/\ > / /g' $ cat hoge.txt | sed 's/\n/ /' ■実行環境 OS : RedHat EL 1 sedのバージョン : sed-4.0.7-3 宜しくお願い致します。

  • 文字の置換がうまくいかない

    ********** test.txt ************* $first = "abc"; $last = "xyz"; ********************************* ********** change.txt *********** $first $firstaaa $last ********************************* という2つのテキストファイルがあったとして、 open(IN,"test.txt"); @data = IN; close IN; open(A,"change.txt"); while(<A>){$a_data .= $_} close A; foreach (@data) { if(/(\$[a-zA-Z_]+)[\t\s]*=[\t\s]*"(.+)"[\t\s]*;/){ my $name = $1; my $value = $2; print "$name<br>"; #$nameに何が入っているか表示 $a_data =~ s/$name/$value/g; } } としても、change.txtの$firstや$lastがabcや、xyzに置換されないのですが、なにがいけないのでしょうか?print "$name<br>";のところではちゃんと$firstと$lastという風に出力されています。$a_data =~ s/$name/$value/g;を$a_data =~ s/\$first/$value/g; と変えると、ちゃんと$firstだけ置換されました。 なにか心当たりがある方、よろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう