拥有此代码:
use 5.020;
use warnings;
use Data::Dumper;
my %h = (
k1 => [qw(aa1 aa2 aa1)],
k2 => [qw(ab1 ab2 ab3)],
k3 => [qw(ac1 ac1 ac1)],
);
my %h2;
for my $k (keys %h) {
$h2{$k}{$_}++ for (@{$h{$k}});
}
say Dumper \%h2;
产生
$VAR1 = {
'k1' => {
'aa2' => 1,
'aa1' => 2
},
'k3' => {
'ac1' => 3
},
'k2' => {
'ab1' => 1,
'ab3' => 1,
'ab2' => 1
}
};
可以用“另一种方式”编写上面的代码吗? (例如更简单或更紧凑)?
答案 0 :(得分:4)
老实说,我不喜欢评估$h2{$k}
的次数。
my %h2;
for my $k (keys %h) {
my $src = $h{$k};
my $dst = $h2{$k} = {};
++$dst->{$_} for @$src;
}
子程序可以帮助使意图更加明显。也许
sub counts { my %c; ++$c{$_} for @_; \%c }
$h2{$_} = counts(@{ $h{$_} }) for keys %h;
如果您就地进行更改,可以简化。
sub counts { my %c; ++$c{$_} for @_; \%c }
$_ = counts(@$_) for values %h;