1

ハッシュの配列を作成しようとしていますが、配列内の各ハッシュを参照する方法を知りたいですか?

例:

while(<INFILE>)    
{    
  my $row = $_;    
  chomp $row;    
  my @cols = split(/\t/,$row);    
  my $key = $cols[0]."\t".$cols[1];     

  my @total = (); ## This is my array of hashes - wrong syntax???    

  for($i=2;$i<@cols;$i++)    
  {    
    $total[$c++]{$key} += $cols[$i];      
  }    
}

close INFILE;

foreach (sort keys %total)  #sort keys for one of the hashes within the array - wrong syntax???    
{    
  print $_."\t".$total[0]{$_}."\n";    
}

助けてくれてありがとう。

4

2 に答える 2

3

あなたは必要ありません

my @total = ();

これ:

my @total;

あなたが求めているものには十分です。配列にハッシュが含まれることを宣言するために特別な構文は必要ありません。

その部分を行うにはおそらくさまざまな方法がありますforeachが、これはうまくいくはずです:

foreach (sort keys %{$total[$the_index_you_want]}) {
  print $_."\t".$total[$the_index_you_want]{$_}."\n";
}

[ところで、my @total;そのループ内で宣言することはおそらくあなたが望むものではありません(それは各行でリセットされるでしょう)。それを最初のループの外に移動します。]

そしてuse strict; use warnings;、明らかに:-)

于 2011-03-30T19:18:43.293 に答える
1

これが私が得るものです:

print join( "\t", @$_{ sort keys %$_ } ), "\n" foreach @total;

私は単純に繰り返し処理し@total、各ハッシュ参照に対してソートされた順序でスライスを取得し、それらの値をタブで結合しています。

並べ替えられた順序でそれらを必要としない場合は、

print join( "\t", values %$_ ), "\n" foreach @total;

しかし、私はまた、次のようにライン処理を圧縮します:

my ( $k1, $k2, @cols ) = split /\t/, $row;
my $key                = "$k1\t$k2";
$totals[ $_ ]{ $key } += $cols[ $_ ] foreach 0..$#cols;

しかし、を使用するとList::MoreUtils、これを行うこともできます。

use List::MoreUtils qw<pairwise>;
my ( $k1, $k2, @cols ) = split /\t/, $row;
my $key                = "$k1\t$k2";
pairwise { $a->{ $key } += $b } @totals => @cols;    
于 2011-03-30T22:21:38.627 に答える