我怎样才能在Perl中结合散列?

将哈希合并到%hash1中的最佳方法是什么? 我总是知道%hash2和%hash1总是有唯一的键。 如果可能的话,我也更喜欢一行代码。

$hash1{'1'} = 'red'; $hash1{'2'} = 'blue'; $hash2{'3'} = 'green'; $hash2{'4'} = 'yellow'; 

快速回答(TL; DR)


     %newHash =(%hash1,%hash2);  %hash1 =%newHash;

     ## 要不然 ...

     @ hash1 {keys%hash2} = values%hash2;

     ## 要不然 ...

     %hash1 =(%hash1,%hash2)

     ##或引用...(按照https://stackoverflow.com/users/196507/lepe)

     $ hash_ref1 =($ hash_ref1,$ hash_ref2);

概观

  • 上下文: Perl 5.x
  • 问题:用户希望将两个散列1合并成一个variables

  • 使用上面的语法简单的variables
  • 对复杂的嵌套variables使用Hash :: Merge

陷阱

  • 当两个哈希都包含一个或多个重复键时,该做什么?
    • 应该用一个空值的键值对覆盖一个非空值的键值对吗?
    • 什么构成了空虚与非空虚的价值呢? (例如, undef ,空string, false ,虚假…)
    • (注意:原来的问题排除了这种情况,但这是一个重要的考虑因素)

也可以看看

  • 下午post合并哈希
  • PM分类问答哈希联盟
  • Perl Cookbook 5.10。 合并哈希
  • websearch:// perlfaq“合并两个哈希”
  • websearch:// perl合并哈希
  • https://metacpan.org/pod/Hash::Merge

脚注

1 *(又名关联数组 ,又名字典 )

检查perlfaq4:我如何合并两个散列 。 在Perl文档中已经有很多很好的信息,你可以立即使用,而不是等待别人来回答。 🙂


在决定合并两个散列值之前,如果两个散列值都包含相同的键值,并且要保留原始散列值,则必须决定如何处理。

如果要保留原始散列,请将一个散列(%hash1)复制到一个新散列(%new_hash),然后将另一个散列(%hash2)中的键添加到新散列中。检查该键是否已存在于%new_hash让您有机会决定如何处理重复项目:

 my %new_hash = %hash1; # make a copy; leave %hash1 alone foreach my $key2 ( keys %hash2 ) { if( exists $new_hash{$key2} ) { warn "Key [$key2] is in both hashes!"; # handle the duplicate (perhaps only warning) ... next; } else { $new_hash{$key2} = $hash2{$key2}; } } 

如果你不想创build一个新的散列,你仍然可以使用这种循环技术; 只要将%new_hash改为%hash1。

 foreach my $key2 ( keys %hash2 ) { if( exists $hash1{$key2} ) { warn "Key [$key2] is in both hashes!"; # handle the duplicate (perhaps only warning) ... next; } else { $hash1{$key2} = $hash2{$key2}; } } 

如果你不关心一个散列覆盖另一个散列的键和值,你可以使用一个散列片将一个散列添加到另一个散列。 在这种情况下,当来自%hash2的值具有共同的键时,它们会从%hash1中replace值:

 @hash1{ keys %hash2 } = values %hash2; 

这是一个古老的问题,但在我的谷歌search'perl合并散列'出来高 – 但它没有提到非常有用的CPAN模块Hash :: Merge

对于哈希引用。 你应该使用大括号

 $hash_ref1 = {%$hash_ref1, %$hash_ref2}; 

而不是上面使用括号的build议答案

 $hash_ref1 = ($hash_ref1, $hash_ref2);