grep
运算符是计算列表中符合特定条件的值的最佳工具。只需遍历哈希值列表的每个条目即可获得每个元素的计数。
此代码假定每个哈希值数组具有相同的长度,并使用第一个元素的长度作为所有它们的大小。
use strict;
use warnings;
my %data = (
234 => [ qw/aa bb aa ab aa/ ],
235 => [ qw/aa ab aa bb aa/ ],
236 => [ qw/bb aa aa aa bb/ ],
);
my @count_bb;
for my $i ( 0 .. $#{(values %data)[0]} ) {
$count_bb[$i] = grep { $_->[$i] eq 'bb' } values %data;
}
print "@count_bb\n";
输出
1 1 0 1 1
此替代方法将创建一个散列,其中包含散列值数组中每个不同值的计数。第一步初始化散列以在每个元素中具有正确数量的零,第二步增加数据中遇到的每个值的计数,最后循环打印结果%counts
散列的内容。
use strict;
use warnings;
my %data = (
234 => [ qw/aa bb aa ab aa/ ],
235 => [ qw/aa ab aa bb aa/ ],
236 => [ qw/bb aa aa aa bb/ ],
);
my %counts;
$counts{$_} = [ (0) x @{(values %data)[0]} ] for map @$_, values %data;
for my $i ( 0 .. $#{(values %data)[0]} ) {
$counts{$_}[$i]++ for map $_->[$i], values %data;
}
while (my ($k, $v) = each %counts) {
printf "%s => (%s)\n", $k, join ', ', @$v;
}
输出
ab => (0, 1, 0, 1, 0)
bb => (1, 1, 0, 1, 1)
aa => (2, 1, 3, 1, 2)