合并Perl HOH的重复路径值

合并Perl HOH的重复路径值,perl,Perl,我有一个perl HOH(散列的散列),其中我有序列号1,2,3。。。。依此类推,并将目录路径与相关计数器值关联。有谁能建议一种方法,我可以合并重复的内部路径(例如,/usr/lib,/bin/)以形成一个新的哈希,并添加值 样本HOH: $VAR1 = { '1' => { '/usr/lib' => 18 }, '3' => {

我有一个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'
              
        };
试一试

使用此子例程(如
aggregate\u 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
        };
试一试

使用此子例程(如
aggregate\u 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中请求帮助时,请将您的代码也张贴在问题中。

这可以帮助您:

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中请求帮助时,请在问题中同时发布您的代码。

您不关心外部散列的键。让我们从
值(%$VAR1)
开始:

{'/usr/lib'=>18},
{'/bin/'=>'3'},
{'/usr/lib'=>12},
{'/bin/'=>'6'},
{'/dev/'=>'2'},
{'/tmp/'=>'8'},
散列是分组的好方法。我们将迭代上面的列表,然后我们将迭代每个散列的元素,使用散列对它们进行分组

my%已分组;
对于my$inner(值(%$VAR1)){
对于我的$key(key(%$inner)){
my$val=$internal->{$key};
$GROUBLED{$key}+=$val;
}
}

我们已经完成了。

您不关心外部散列的键。让我们从
值(%$VAR1)
开始:

{'/usr/lib'=>18},
{'/bin/'=>'3'},
{'/usr/lib'=>12},
{'/bin/'=>'6'},
{'/dev/'=>'2'},
{'/tmp/'=>'8'},
散列是分组的好方法。我们将迭代上面的列表,然后我们将迭代每个散列的元素,使用散列对它们进行分组

my%已分组;
对于my$inner(值(%$VAR1)){
对于我的$key(key(%$inner)){
my$val=$internal->{$key};
$GROUBLED{$key}+=$val;
}
}

我们已经完成了。

@ikegami我已经修改了答案,记住了你的建议。您能否澄清何时触发未初始化的值和警告?我使用了
exists
来避免这种情况。Post/pre-inc/dec、+=和-=不在乎。看起来|=和^=都不做(但是&=做)。@ikegami我已经修改了答案,记住了你的建议。您能否澄清何时触发未初始化的值和警告?我使用了
exists
来避免这种情况。Post/pre-inc/dec、+=和-=不在乎。看起来像|=和^=都没有(但是&=有)。