- ベストアンサー
1_1から1_5へカウントアップ後、2_1から1_5へカウントアップしたい
お世話になります。 題名にあります通りなんですが、1_1から1_5にカウントアップしたら 2_1から2_5へとカウントアップするようなスクリプトを考えているのですが 下記の例ですと、1111122222333334444455555となってしまいなす。 どなたか良きアドバイス頂けないでしょうか。宜しくお願いします。 @list = (0, 1, 2, 3, 4, 5); foreach $b(@list) { for ( $a = 1 ; $a <= 5 ; $a++ ) { print ""; print "$a_$b\n" ; } }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
foreach my $first (1..5) { foreach my $second (1..5){ print "${first}_$second\n"; } } こんな感じの処理でしょうか?
その他の回答 (2)
- kapura
- ベストアンサー率50% (48/95)
# 示されたプログラムを実行すると、最初に0も5回出力されると思うので、@list = (1, 2, 3, 4, 5); の間違いですよね? そういう出力になるのは、print "$a_$b\n" で$a_という変数と解釈されているからでしょう。$a_という変数はないのでその部分は何も出力されず、$bだけが展開されている。 これを解決するには、No.1の方も示されている通り、$aの代わりに${a}とするなどすればいいです。print $a, "_$b\n" とか他にも解決策はいろいろありますが。 でもこう書き換えても望みの結果は得られないでしょう。先に動かしたい数字は_の右の数字なのですから、print "${b}_$a\n" という風にaとbを逆にするとかしないといけないと思いますよ。
- SHOO-3
- ベストアンサー率56% (28/50)
print "$a_$b\n"; この段階で $a_ がひとつの変数とみなされています。 つまり、$aとは別に、グローバルに$a_が定義されてしまっている状態になっています。 解決策は、 print "${a}_$b"; とすることなどがあげられますが、 こういったあいまいな記述によるエラーを防ぐためには、 use strict; と最初に宣言するといいでしょう。(文法が厳しくチェックされるので、あいまいな記述ができなくなります)