ETA:負の行列値のサポートを修正しました。ゼロ値が必要なため、浮動小数点数が発生しないと仮定します。
多次元配列を使用する秘訣は、配列にはスカラー値しか含めることができないことを覚えておくことです。この場合、各スカラー値は配列への参照です。
行列に正の整数以外の値を含めることができる場合は、データストレージとしてハッシュを使用する必要があります。
以下の印刷では、初期化されていない(ゼロ)カウントを区別するために、 defined-or演算子を使用しています。
use strict;
use warnings;
use Data::Dumper;
use List::Util qw(max min);
my @a = (
[qw(1 1 1 2 1 1)],
[qw(2 1 4 1)],
[qw(2 1 1 3 1 6)],
);
my @res;
my ($max, $min);
for my $aref (@a) { # each array element is an array ref
my %count;
for (@$aref) { # the array elements of each ref
$count{$_}++; # count the numbers
}
$max = max(@$aref, $max // ());
$min = min(@$aref, $min // ());
push @res, \%count;
}
for my $href (@res) {
print join " ", map $href->{$_} // 0, $min .. $max;
print "\n";
}
print Dumper \@res;
出力:
5 1 0 0 0 0
2 1 0 1 0 0
3 1 1 0 0 1
$VAR1 = [
{
'1' => 5,
'2' => 1
},
{
'4' => 1,
'1' => 2,
'2' => 1
},
{
'6' => 1,
'1' => 3,
'3' => 1,
'2' => 1
}
];
欠落しているゼロ値に注意してください。map
これらは、printステートメントと同様のステートメントで追加できます。