【问题标题】:Perl - Merge hash containing duplicate keysPerl - 合并包含重复键的哈希
【发布时间】:2018-04-07 07:52:24
【问题描述】:

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

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;

但是我得到一个异常说不能修改标量赋值中的常量项。我做错了什么?

【问题讨论】:

  • 程序对我来说运行良好。
  • 您发布的内容并未证明您声称的问题。请解决您的问题。 minimal reproducible example

标签: perl hash


【解决方案1】:

你说:

我希望 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
        };

所以你的代码正在做你想做的事。它只是对另一个哈希执行此操作。您的代码没有任何问题。

【讨论】:

    【解决方案2】:

    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";
        }
    }
    

    【讨论】:

    • 奇怪的是,我的本地盒子向我抛出了错误。我会尝试更新我的 perl 版本以防万一。
    • 尝试运行我粘贴的这段代码,以确认是您的 perl 版本造成了问题。你也可以试试tutorialspoint.com/execute_perl_online.php
    • 因为您的代码也没有为我提供所需的输出
    • 你的代码现在给了我想要的结果。有什么我遗漏的吗?
    • 我希望问题出在这一行 - $hash2->{$accountId} accountid 来自哪里
    猜你喜欢
    • 2011-06-14
    • 2018-06-10
    • 2014-04-16
    • 2020-10-23
    • 2018-07-21
    • 1970-01-01
    • 2015-05-07
    • 2013-08-04
    • 2012-04-28
    相关资源
    最近更新 更多