如何在Perl中连接两个哈希而不使用循环?

如何在Perl中连接两个哈希而不使用循环?,perl,hash,Perl,Hash,在Perl中,如何在不使用循环的情况下将散列a附加到散列b?如果您的意思是获取它们的数据的并集,只需执行以下操作: %c = (%a, %b); 您还可以使用切片将一个散列合并到另一个散列: @a{keys %b} = values %b; 请注意,%b中的项目将覆盖%a中具有相同密钥的项目。这将合并哈希并考虑未定义的条目,因此它们不会替换内容 my %hash = merge(\%hash1, \%hash2, \%hash3); sub merge { my %result;

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

如果您的意思是获取它们的数据的并集,只需执行以下操作:

%c = (%a, %b);

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

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

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

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

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

它适用于我:“%a=('a'=>'b','c'=>1);%b=('c'=>'d');%a=(%a,%b);打印联接(',',,映射{'$\'=>\“${a{$}\\\\\\\”}键%a),“\n”;“来自%b的具有相同键的项优先,但来自%a的其他项在并集后出现。这可能是OP的问题,他们可能希望合并哈希值,因此,$a{'c}[1,'d']在这种情况下,他们应该查看CPA上的Hash::Merge以获得额外的积分,在a和b中有一个Hash ref,我们需要{$a}{keys%$b}=值%$b;我希望此回复比另一个回复更有效,因为其中一个回复也会为已存在的项重新创建哈希,而此回复只是为新项添加键。如果%a中有许多项,与%b相比,差异可能是可观的。可能。我的方法还会遍历%b两次。如果%b大于%a,则另一个技术可能更快。最快的可能是一个循环,但OP不希望这样。@bart:看起来你是对的。在OS X 10.4上,perl 5.8.9的一些非常简单的计时测试将切片方法的速度提高了约2.4倍,即使%b比%a大得多。你的里程可能会有所不同。如果我不是很严格,这也适用于幸运的hashrefs错了。现在就试试。方便!你为什么不想使用循环呢?
my %c = %a;
map {$c{$_} = $b{$_}} keys %b;