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并为每个 hashref 按排序顺序获取一个切片并将这些值与选项卡连接起来。

如果您不需要按排序顺序排列它们,则可以

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 回答