Perl - 包含重复键的Merge哈希

时间:2017-10-26 04:08:40

标签: perl hash

我有两个哈希,可以包含相同的键。我试图以这样的方式合并两个哈希,如果密钥存在于两个哈希中,我想在各自的哈希值中添加值。

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;

但我得到一个例外,说不能在标量赋值中修改常量项。我做错了什么?

2 个答案:

答案 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
        };

所以你的代码正在做你想要的。它只是对另一个哈希做了。您的代码没有任何问题。