• ベストアンサー

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" ; } }

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

  • ベストアンサー
  • hara_peko
  • ベストアンサー率28% (11/38)
回答No.1

foreach my $first (1..5) { foreach my $second (1..5){ print "${first}_$second\n"; } } こんな感じの処理でしょうか?

その他の回答 (2)

  • kapura
  • ベストアンサー率50% (48/95)
回答No.3

# 示されたプログラムを実行すると、最初に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)
回答No.2

print "$a_$b\n"; この段階で $a_ がひとつの変数とみなされています。 つまり、$aとは別に、グローバルに$a_が定義されてしまっている状態になっています。 解決策は、 print "${a}_$b"; とすることなどがあげられますが、 こういったあいまいな記述によるエラーを防ぐためには、 use strict; と最初に宣言するといいでしょう。(文法が厳しくチェックされるので、あいまいな記述ができなくなります)

関連するQ&A