• ベストアンサー

not enough argument in 3rd line & does not show the right response

test.datの中身は以下の通り。 line a b c d 1 1a 1b 1c 1d 2 2a 2b 2c 2d 文字と文字の間の空間はタブです。 open (my $SIM_FILE, "test.dat") or die "can't open the file\n"; my @cols = split /\t/, readline($SIM_FILE); my %simulation = &read(@col); close $SIM_FILE; while ((my $key, my $value) = each(%simulation)) { print "$key : $value\n"; } sub read { while (my $line = readline($SIM_FILE)) { chomp $line; next unless ($line); my @values = split /\t/, $line; if (@values == @cols) { my %tmp_hash; my $year for (my $i = 0; $i<@cols; $i++) { $tmp_hash{$cols[$i]} = $values[$i]; $year = $values[$i] if ($col[$i] =~ /^year$/i); } $simulation{$year} = \%tmp_hash; } } }

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

プログラムの内容以前の問題ですが: read を呼出すときに引数に @cols を渡す意味もわからない (read の中では引数を使っていない) ですし, 返り値を %simulation に代入する意味もわかりません (read の中で %simulation に対する実行を行っている). その辺をきれいにしてみてください. なんとなく手元では my %simulation = &read(@cols); の行を分けるだけで動いているように見えますが自身なし.

striatum
質問者

お礼

色々 きれいにしてみたところ 動くようになりました。 ありがとうございました。

その他の回答 (2)

回答No.3

$line=readline(*SIM_FILE); じゃないですか? openのときに$をつけずに open (SIM_FILE, "test.dat") or die "can't open the file\n"; としないといけないかも。 引数や戻り値、ファイルをオープンするタイミングや、リードするタイミングを整理した方が良いのは賛成 (必要があればseekしなければなりません)

striatum
質問者

お礼

整理したところ無事 動きました。 ありがとうございました。

  • ballville
  • ベストアンサー率47% (233/487)
回答No.1

my %simulation = &read(@col); を my %simulation = &read(@cols); に。

striatum
質問者

お礼

回答ありがとうございます。タイプミスしました。 直したのですが、いぜんとして働きません・・・。

関連するQ&A