通过计数将HoA转换为HoH

时间:2014-08-03 21:35:45

标签: perl

拥有此代码:

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
                  }
        };

可以用“另一种方式”编写上面的代码吗? (例如更简单或更紧凑)?

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;