• ベストアンサー

ハッシュの配列を作ることは可能でしょうか?

次のようなファイルがある場合、%hash1と%hash2を同じ配列として扱いたいと思っています。 例えば、hash[0]{A}とアクセスすれば'01'、hash[1]{B}とアクセスすれば'002'となるようにしたいと思っています。ご教授ください。 -------------------- A B C 01 001 0001 02 002 0002 %hash1 = {'A'=>'01', 'B'=>'001', 'C'=>'0001'}; %hash2 = {'A'=>'02', 'B'=>'002', 'C'=>'0002'};

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

  • ベストアンサー
  • Dpop
  • ベストアンサー率51% (279/544)
回答No.2

#1 です。答えです。(なんとなく。) #/usr/local/bin/perl @data = ( {'A'=>'01', 'B'=>'001', 'C'=>'0001'}, {'A'=>'02', 'B'=>'002', 'C'=>'0002'}); foreach $j (sort keys %{$data[0]}) { print $j. ' '; } print "\n", '-'x 10, "\n"; for $i (0 .. scalar(@data)-1) { foreach $j (sort keys %{$data[$i]}) { print $data[$i]{$j}. ' '; } print "\n"; } こんな感じで良いかな。

その他の回答 (2)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.3

ファイルの1行目が項目名で、各項目は空白(タブ)で区切られている、という前提で。 sub read_data {   my (@key, @data);   local $_;   open FH, shift or die $!;   chomp($_ = <FH>);   # キー取り出し   @key = split /\s+/;   while (<FH>) {      # データ取り出し     chomp;     my %d; @d{@key} = split /\s+/;     push @data, \%d;   }   close FH;   return @data; } という関数を作成すると、 @hash = read_data("ファイル名"); print $hash[0]{A};   # 01 と表示される。 print $hash[1]{B};   # 002 と表示される。 のように使えます。 ※スクリプトの字下げに全角スペースを使っているので、コピーする場合はタブなどに置き換えてご利用ください。

  • Dpop
  • ベストアンサー率51% (279/544)
回答No.1

参考になるソースを示しますので、読んで見てください。 # ハッシュの配列を静的に作る %c = ( A => [ qw(aa ab ac ad ae) ], B => [ qw(ba bb bc bd be) ], C => [ qw(ca cb cc cd ce) ] ); # 静的に作ったハッシュの配列を取り出してみる foreach $i (sort keys %c) { for $j (0 .. scalar(@{$c{$i}})-1) { print '$c{'. $i. '}['. $j. ']='. $c{$i}[$j]. ' '; } print "\n"; } print "\n"; # ハッシュの配列を動的に作る %g = (); open(IN, 'in.data') || die "open error"; while(<IN>) { chop; my(@w); @w = split(/ /); $g{uc(substr($_, 0, 1))} = \@w; } close(IN); # 動的に作ったハッシュの配列を取り出してみる foreach $i (sort keys %g) { for $j (0 .. scalar(@{$g{$i}})-1) { print '$g{'. $i. '}['. $j. ']='. $g{$i}[$j]. ' '; } print "\n"; } print "\n"; 動的に作る。の方は、 aa ab ac ad ae ba bb bc bd be ca cb cd ce cf こんなデータを読み込むようになっています。どちらの場合でも、 $g{A}[0]=aa $g{A}[1]=ab $g{A}[2]=ac $g{A}[3]=ad $g{A}[4]=ae $g{B}[0]=ba $g{B}[1]=bb $g{B}[2]=bc $g{B}[3]=bd $g{B}[4]=be $g{C}[0]=ca $g{C}[1]=cb $g{C}[2]=cd $g{C}[3]=ce $g{C}[4]=cf と言う結果が返ってきます。

関連するQ&A