• ベストアンサー

ファイルからデータを読み込んで配列に格納するには

読んでいただいてありがとうございます。 Perlをはじめたばかりなのと プログラミング自体もまだまだですので 困っております。 テキストデータ 例えば apple りんご banana バナナ orange オレンジ などというファイルから読み込んで、 my $data ={ my @english, my @japanese, }; などの、配列の構造体に格納するにはどのようにしたら よいのでしょうか。 最初、本を少し読んだだけの知識で、 use strict; use warnings; my $filename = 'data.txt'; my $data = { my @english, my @japanese }; open(IN,$filename) or die "$filename: $!"; while(my $line=<IN>){ for(my $i=0;$i<N;$i++){ ($data->{@english}[$i],$data->{@japanese}[$i])=split(/ /,$line); print "$data->{@english}[$i]\n"; } } close(IN); } などと書いて、 apple banana orange と表示されるのを期待したのですが、 ダメでした。 参考までに私の誤ったプログラムものせましたが、 全然違っているかもしれませんので、まったく新たに アドバイスしていただいてもかまいません。 これを応用したものを使いたいので ぜひともどなたかお教え いただければと思います。 よろしくお願いします。

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

  • ベストアンサー
  • kodomo55
  • ベストアンサー率57% (8/14)
回答No.3

#1です。大した回答になっていなかったので、再投稿します。 Perlを学んで数日ということで、サンプルコードを載せておきます。 use strict; use warnings; my (@english, @japanese); open IN, "<data.txt" or die $!; flock IN, 1; while (<IN>) { chomp; split(/\s+/); push @english, $_[0]; push @japanese, $_[1]; } close IN; my $data = { english => [@english], japanese => [@japanese] }; print $data->{japanese}[1]; 最初は、@english と @japanese それぞれの配列に入れています。 最後に、お望みの形にする為に、$dataに格納しています。

その他の回答 (3)

回答No.4

"...などの、配列の構造体に格納"ということから、 恐らく、ハッシュ(いわゆる連想配列)に格納したい、 ということのなのでしょうね。 ハッシュ変数は頭に "%" をつけたものです。 もしそれをご存知ないようでしたら まずそこまで勉強されるのがよいでしょう。 ハッシュに特化した関数がいろいろあり簡単に記述できます。

  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

テキストデータから読み込まずに Perlコードに直書きで配列に格納した状態にすることはできますか? なんか、そのコード見てると読み込む以前の所から怪しい気がしたもので…。

donntakosu
質問者

お礼

そうなのです。。。Perl初めて2、3日なもので。。。その状態で プログラムを書いていると 何があっていて何が間違っているのか分からず。。。 今は例というか 練習として上記のような少しのデータでしたが、 実際に扱うことになるのは大量のデータが入ったファイルなので ファイルから読み込んで配列に格納するということがしたかったのです (>_<)

  • kodomo55
  • ベストアンサー率57% (8/14)
回答No.1

このプログラムには致命的な点があります。 $data = { } の意味をもう一度学習されると良いでしょう。 これは、無名ハッシュのリファレンスです。 ハッシュなのに my @english, my @japanese を格納しても意味がありませんので、 ここは、$data = { english => undef, japanese => undef } などとして、$data->{english}[$i] 等として使うと良いかもしれません。 ややこしいなら、リファレンスを使わずに書いてみましょう。

関連するQ&A