我正在尝试创建一个哈希数组,我想知道如何引用数组中的每个哈希?
例如:
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";
}
提前感谢您的帮助。
答案 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;