合并Perl HOH的重复路径值
我有一个perl HOH(散列的散列),其中我有序列号1,2,3。。。。依此类推,并将目录路径与相关计数器值关联。有谁能建议一种方法,我可以合并重复的内部路径(例如,/usr/lib,/bin/)以形成一个新的哈希,并添加值 样本HOH:合并Perl HOH的重复路径值,perl,Perl,我有一个perl HOH(散列的散列),其中我有序列号1,2,3。。。。依此类推,并将目录路径与相关计数器值关联。有谁能建议一种方法,我可以合并重复的内部路径(例如,/usr/lib,/bin/)以形成一个新的哈希,并添加值 样本HOH: $VAR1 = { '1' => { '/usr/lib' => 18 }, '3' => {
$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、+=和-=不在乎。看起来像|=和^=都没有(但是&=有)。