ETA:修复了对负矩阵值的支持。假设不会出现浮点数,因为需要零值。
使用多维数组的技巧是记住数组只能包含标量值。在这种情况下,每个标量值都是对数组的引用。
如果您的矩阵可以包含正整数以外的其他值,则必须使用散列作为数据存储。
在下面的打印中,我使用定义或运算符来区分未初始化(零)计数。
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 语句中的语句添加这些语句。