- ベストアンサー
文字の結合
Perl初心者です。 ある条件にしたがって文字を結合したいのですが、なかなかうまくいきません。以下のように記述してみたのですが何かヒントございましたらお教え願えませんでしょうか。 実現したいのは、たとえばQ5_1a_1_CB_1とQ5_1a_1_CB_3が"1"だったら_KINOU5_1a_1_に「あ,う」、Q5_1b_1_CB_1とQ5_1b_1_CB_5とQ5_1b_1_CB_6が"1"だったら_KINOU5_1b_1_に「あ,お,か」と代入したいのです。 想像では「$kinou .= $z.",";」のところが何か不足しているような気がします。 for($i=1; $i<=14; $i++){ for ($j=1; $j<=3; $j++){ $c = ('','a','b','c','d','e','f','g','h','i','j','k','l','m','n',)[$i]; $name2 = "_KINOU5_1".$c."_"."$j"."_"; $kinou = ""; for ($k=1; $k<=11; $k++){ $z = ('','あ','い','う','え','お','か','き','く','け','こ','さ',)[$k]; $name3 = "Q5_1".$c."_"."$j"."_CB_".$k; if ($data{$name3} eq '1'){ $kinou .= $z.","; } } chop $kinou; $newtemplate =~ s/$name2/$kinou/g; } }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
特に問題ないようにみえますね。 なんらかのデバッグはされましたでしょうか。 print デバッグという最も基本的なデバッグ方法があります。 変数の値を実際に出力してみて確かめる方法です。 まず、プログラムのはじめのほうに、 (#!/usr/bin/perl の後ならどこでもよい) use Data::Dumper; の1行を記述します。 次に、 たとえば、$name2 ならば、 適当な箇所で、 warn '$name2: ', Dumper($name2); のように記述します。 ハッシュ変数なら、 warn '%data: ', Dumper(%data); といったぐあいです。 そして、プログラムを実行すると、変数の値が標準エラーに出力されます。 $a: $VAR1 = '_KINOU5_1b_1_'; 期待通りの値が変数に格納されているかどうかを確かめてみてください。
その他の回答 (1)
- sakusaker7
- ベストアンサー率62% (800/1280)
なんかごちゃごちゃして解りづらいですが、$kinouは希望通りの文字列になってませんか? my %data = ( Q5_1a_1_CB_1 => "1", Q5_1a_1_CB_3 => "1", Q5_1b_1_CB_1 => "1", Q5_1b_1_CB_5 => "1", Q5_1b_1_CB_6 => "1" ); for($i=1; $i<=14; $i++){ for ($j=1; $j<=3; $j++){ $c = ('','a','b','c','d','e','f','g','h','i','j','k','l','m','n',)[$i]; $name2 = "_KINOU5_1".$c."_"."$j"."_"; $kinou = ""; for ($k=1; $k<=11; $k++){ $z = ('','あ','い','う','え','お','か','き','く','け','こ','さ',)[$k]; $name3 = "Q5_1".$c."_"."$j"."_CB_".$k; if ($data{$name3} eq '1'){ $kinou .= $z.","; } } chop $kinou; #$newtemplate =~ s/$name2/$kinou/g; print "\$name2=$name2, \$kinou=$kinou\n" if $kinou ne q{}; } } print "######\n"; foreach my $c (qw(a b c d e f g h i j k l m n)) { foreach $j (1..3) { my $name2 = sprintf "_KINOU5_1%s_%d_", $c, $j; my $k; my @tmp; foreach $z (qw(あ い う え お か き く け こ さ)) { my $name3 = sprintf "Q5_1%s_%d_CB_%d", $c, $j, ++$k; push @tmp, $z if $data{$name3} eq '1' } my $kinou = join q{,}, @tmp; print "\$name2=$name2, \$kinou=$kinou\n" if $kinou ne q{}; #$newtemplate =~ s/$name2/$kinou/g; } } 実行結果: $name2=_KINOU5_1a_1_, $kinou=あ,う $name2=_KINOU5_1b_1_, $kinou=あ,お,か ###### $name2=_KINOU5_1a_1_, $kinou=あ,う $name2=_KINOU5_1b_1_, $kinou=あ,お,か もう少し具体的に何がどううまくいかないのか説明してもらえますか?
お礼
早々のご回答ありがとうございます。 表示する側のHTMLの変数に誤りがありました。。。 何も表示されないので、絶対にプログラムがおかしいと思ってしまいました。sakusaker7様の回答を拝見して、その他の要因を探してみて気付きました。 早とちりですみません。ありがとうございました。
お礼
ありがとうございます。表示する側のHTMLの変数に誤りがありました。。。表示されないので、絶対にプログラムがおかしいと思ってしまいました。上記実行しましたら期待通り格納されていましたので、その他の要因を探してわかりました。すみません。ありがとうございました。