我有两个哈希,可以包含相同的键。我试图以这样的方式合并两个哈希,如果密钥存在于两个哈希中,我想在各自的哈希值中添加值。
my %hash1= ();
$hash1{'apple'} = 10;
$hash1{'banana'} = 15;
$hash1{'kiwi'} = 20;
my %sourceHash = ();
$sourceHash{'apple'} = 12;
$sourceHash{'orange'} = 13;
$sourceHash{'banana'} = 5;
mergeHash(\%hash1, \%sourceHash);
sub mergeHash {
my $hash1 = shift;
my $hash2 = shift;
foreach my $key (keys %{$hash1})
{
if (exists $hash2->{$key}) {
${hash2}->{$key} = $hash1->{$key} + $hash2->{$key};
} else {
${hash2}->{$key} = $hash1->{$key};
}
}
}
我希望hash1的结果是
hash1{'apple'} = 22;
hash1{'orange'} = 13;
hash1{'banana'} = 20;
hash1{'kiwi'} = 20;
但我得到一个例外,说不能在标量赋值中修改常量项。我做错了什么?
答案 0 :(得分:0)
PFB使用正确的语法更新代码,并且还提供所需的输出:
my %hash1= ();
$hash1{'apple'} = 10;
$hash1{'banana'} = 15;
$hash1{'kiwi'} = 20;
my %sourceHash = ();
$sourceHash{'apple'} = 12;
$sourceHash{'orange'} = 13;
$sourceHash{'banana'} = 5;
mergeHash(\%hash1, \%sourceHash);
sub mergeHash {
my $param1 = shift;
my %hash1 = %$param1;
my $param2 = shift;
my %hash2 = %$param2;
foreach my $key (keys %hash1){
if(exists $hash2{$key}){
print "coming in here for $hash1->{$key} \n";
$hash2{$key} = $hash1{$key} + $hash2{$key};
}
else{
$hash2{$key} = $hash1{$key};
}
}
showHash(\%hash2);
}
sub showHash{
my $param = shift;
my %param_hash = %$param;
for my $fruit (keys %param_hash) {
print "The value of '$fruit' is $param_hash{$fruit}\n";
}
}
答案 1 :(得分:0)
你说:
我希望hash1的结果是
hash1{'apple'} = 22; hash1{'orange'} = 13; hash1{'banana'} = 20; hash1{'kiwi'} = 20;
但是在您的代码中,您会迭代$hash1
:
foreach my $key (keys %{$hash1})
并改变$hash2
:
if (exists $hash2->{$key}) { ${hash2}->{$key} = $hash1->{$key} + $hash2->{$key}; } else { ${hash2}->{$key} = $hash1->{$key}; }
因此,您不应期望在$hash1
中看到任何更改,而是正在更改$hash2
。
我将此添加到您的代码中:
use Data::Dumper;
并且在致电mergeHash()
之后:
print Dumper \%hash1, \%sourceHash;
我得到了这个输出:
$VAR1 = {
'apple' => 10,
'kiwi' => 20,
'banana' => 15
};
$VAR2 = {
'orange' => 13,
'banana' => 20,
'kiwi' => 20,
'apple' => 22
};
所以你的代码正在做你想要的。它只是对另一个哈希做了。您的代码没有任何问题。