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
この代替手段は、ハッシュ値配列内のすべての異なる値のカウントでハッシュを作成します。最初のステップでは、各要素に正しい数のゼロが含まれるようにハッシュを初期化し、2 番目のステップでは、データ内で検出された各値のカウントをインクリメントします。最後のループでは、結果の%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)