合并 Perl HOH 的重复路径值

Merging of duplicate path values of a Perl HOH

我有一个 perl HOH(散列的散列),其中我有序列号 1,2,3.... 等等以及具有相关计数器值的目录路径。任何人都可以建议一种方法,我可以将重复的内部路径(例如 /usr/lib , /bin/ )合并为一个新的散列并添加值?

HOH 样本:

$VAR1 = {
          '1' => {
                   '/usr/lib' => 18
                 },
          '3' => {
                   '/bin/' => '3'
                 },
          '4' => {
                   '/usr/lib' => 12
                 },
          '2' => {
                   '/bin/' => '6'
                 },
          '5' => {
                   '/dev/' => '2'
                 },
          '6' => {
                   '/tmp/' => '8'
                 }
        };

我正在寻找的最终输出要求是具有组合值的简单散列。不需要序列号:

$VAR1 = {
              '/usr/lib' => '30',
              '/bin/' => '9',
              '/dev/' => '2',
              '/tmp/' => '8'
              
        };

尝试

sub aggregate_counts {
    my $HOH = shift;
    my %out;
    for my $h (values %$HOH) {
        for my $k ( keys %$h) {
            $out{$k} += $h->{$k};
        }
    }
    \%out
}

aggregate_counts($hoh)一样使用这个子例程来获取所需格式的散列引用。

完整的测试脚本:

use strict;
use warnings;
sub aggregate_counts {
    my $HOH = shift;
    my %out;
    for my $h (values %$HOH) {
        for my $k ( keys %$h) {
            $out{$k} += $h->{$k};
        }
    }
    \%out
}

my
$VAR1 = {
          '1' => {
                   '/usr/lib' => 18
                 },
          '3' => {
                   '/bin/' => '3'
                 },
          '4' => {
                   '/usr/lib' => 12
                 },
          '2' => {
                   '/bin/' => '6'
                 },
          '5' => {
                   '/dev/' => '2'
                 },
          '6' => {
                   '/tmp/' => '8'
                 }
        };


use Data::Dumper;

print Dumper(aggregate_counts($VAR1))

输出:

$VAR1 = {
          '/dev/' => '2',
          '/tmp/' => '8',
          '/bin/' => 9,
          '/usr/lib' => 30
        };

这可以帮助你:

use strict; use warnings;
use Data::Dumper;

my %hash = (
'1' => {
       '/usr/lib' => 18
     },
'3' => {
       '/bin/' => '3'
     },
'4' => {
       '/usr/lib' => 12
     },
'2' => {
       '/bin/' => '6'
     },
'5' => {
       '/dev/' => '2'
     },
'6' => {
       '/tmp/' => '8'
     }
);

my %result;

foreach my $key (keys %hash){
    foreach my $inner (keys %{$hash{$key}}) {
        $result{$inner} += $hash{$key}{$inner};
    }
}

print Dumper(\%result);

输出:

$VAR1 = {
          '/usr/lib' => 30,
          '/bin/' => 9,
          '/dev/' => 2,
          '/tmp/' => 8
        };

注意:在 SO 中寻求帮助时,请 post 您的代码以及问题中的代码。

你不关心外部散列的键。那么让我们从 values(%$VAR1):

开始
{ '/usr/lib' => 18 },
{ '/bin/' => '3' },
{ '/usr/lib' => 12 },
{ '/bin/' => '6' },
{ '/dev/' => '2' },
{ '/tmp/' => '8' },

哈希非常适合分组。我们将迭代上面的列表,然后我们将迭代每个哈希的元素,使用哈希对它们进行分组。

my %grouped;
for my $inner (values(%$VAR1)) {
   for my $key (keys(%$inner)) {
      my $val = $inner->{$key};
      $grouped{$key} += $val;
   }
}

我们已经完成了。