- ベストアンサー
ハッシュの配列を作ることは可能でしょうか?
次のようなファイルがある場合、%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'};
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#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)
ファイルの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)
参考になるソースを示しますので、読んで見てください。 # ハッシュの配列を静的に作る %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 と言う結果が返ってきます。