【问题标题】:How can I join two hashes in Perl without using a loop?如何在不使用循环的情况下在 Perl 中加入两个哈希?
【发布时间】:2010-11-17 13:00:12
【问题描述】:

如何在不使用循环的情况下在 Perl 中将哈希 a 附加到哈希 b?

【问题讨论】:

  • 为什么不想使用循环?

标签: perl hash


【解决方案1】:

如果您的意思是合并他们的数据,那就这样做:

%c = (%a, %b);

【讨论】:

  • 对我有用:"%a=('a' => 'b', 'c' => 1); %b=('c' => 'd'); % a = (%a, %b); print join(', ', map { "'$_' => \"${a{$_}}\"" } keys %a), "\n"; "来自 %b 的具有相同键的项目优先,但来自 %a 的其他项目在联合之后出现。
  • 这可能是 OP 的问题,他们可能想要合并散列的值,所以 $a{'c'} 最终成为 [1, 'd']
  • 在这种情况下,他们应该查看 CPAN 上的 Hash::Merge
【解决方案2】:

您还可以使用切片将一个散列合并到另一个散列中:

@a{keys %b} = values %b;

请注意,%b 中的项目将覆盖 %a 中具有相同键的项目。

【讨论】:

  • 为了获得额外的功劳,在 a 和 b 中使用哈希引用,我们执行 @{$a}{keys %$b} = values %$b;
  • 我希望这比另一个回复更有效,因为那个回复也为已经存在的项目重新创建哈希,而这个只是为新项目添加键。如果 %a 中有很多项目,与 %b 相比,差异是可观的。
  • 也许吧。我的方法也走 %b 两次。如果 %b 大于 %a,则其他技术可能更快。最快的可能是循环,但 OP 不希望这样。
  • @bart:看起来你是对的。在 OS X 10.4 上对 perl 5.8.9 进行的一些相当简单的时序测试将切片方法的速度提高了大约 2.4 倍,即使 %b 比 %a 大得多。您的里程可能会有所不同。
  • 如果我没记错的话,这也应该适用于祝福的 hashrefs。现在试试看。好用!
【解决方案3】:

这将合并哈希并考虑未定义的条目,因此它们不会替换内容。

my %hash = merge(\%hash1, \%hash2, \%hash3);

sub merge {
    my %result;

    %result = %{ $_[0] };
    shift;

    foreach my $ref (@_) {
        for my $key ( keys %{$ref} ) {
            if ( defined $ref->{$key} ) {
                $result{$key} = $ref->{$key};
            }
        }
    }

    return %result;
}

【讨论】:

    【解决方案4】:
    my %c = %a;
    map {$c{$_} = $b{$_}} keys %b;
    

    【讨论】:

      猜你喜欢
      • 2010-11-19
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 2018-11-15
      相关资源
      最近更新 更多