合并 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;
}
}
我们已经完成了。
我有一个 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;
}
}
我们已经完成了。