Perl哈希数组 - 引用数组中的每个哈希?

时间:2011-03-30 19:02:13

标签: arrays perl hash reference perl-data-structures

我正在尝试创建一个哈希数组,我想知道如何引用数组中的每个哈希?

例如:

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";    
}

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您不需要

my @total = ();

此:

my @total;

足以满足您的需求。声明您的数组将包含哈希值时不需要特殊语法。

执行foreach部分可能有不同的方法,但这应该有效:

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

[BTW,在该循环中声明my @total;可能不是你想要的(它会在每一行重置)。将其移到第一个循环之外。]

use strict; use warnings;,显然: - )

答案 1 :(得分:1)

这是我得到的:

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

我只是遍历@total并为每个hashref按顺序排列 slice 并使用标签将这些值连接起来。

如果你不按排序顺序需要它们,你可以

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;    
相关问题