如何在Perl中合并从sub返回的两个哈希

时间:2018-07-04 11:05:27

标签: perl hash reference

我正在尝试合并两个哈希。但是它们是函数的返回值。我如何取消内联返回值的引用?我不想使用额外的变量,例如my $pos = makePos();

use v5.8.8;

use strict;
use warnings;

sub _makePos
{
    my $desc= {
        pos50  => {unit => 'm', desc => 'position error' },
        pos95  => {unit => 'm', desc => '95% position error' }
    };
    return $desc;
}

sub _makeVel
{
    my $desc= {
        vel50  => {unit => 'm/s', desc => 'velocity error' },
        vel95  => {unit => 'm/s', desc => '95% velocity error' }
    };
    return $desc;
}

my $descs = {_makePos(), _makeVel()};
use Data::Dumper;
print Dumper($descs);

这仅打印从_makeVel返回的哈希值。如何运作?

$VAR1 = {
          'HASH(0x21ea4a0)' => {
                                 'vel50' => {
                                              'desc' => 'velocity error',
                                              'unit' => 'm/s'
                                            },
                                 'vel95' => {
                                              'unit' => 'm/s',
                                              'desc' => '95% velocity error'
                                            }
                               }
        };

2 个答案:

答案 0 :(得分:2)

将此行更改为

my $descs = {%{_makePos()}, %{_makeVel()}};

工作了!

答案 1 :(得分:1)

实际上,您的原始解决方案确实打印了两个哈希,但是第一个哈希被“字符串化”,因为它被用作哈希的键。它以HASH(0x21ea4a0)的形式存在。

我看到您有一个解决方案,但是可能值得解释出了什么问题以及为什么您的解决方案将其解决。

您的两个子例程不返回哈希值,而是散列引用。哈希引用是一个标量值,实际上是指向哈希的指针。

从值列表创建哈希。创建新闻哈希(实际上又是哈希引用)的代码是这样的:

my $descs = {_makePos(), _makeVel()};

这是两个标量值。第一个用作新哈希中的键,第二个用作关联值-因此,您从Data::Dumper获得的结果。

您真正想要做的是“取消引用”您的哈希并返回到实际的哈希。您可以使用语法%{ ... }取消引用哈希,其中...是返回哈希引用的任何表达式。这就是您在解决方案中所做的。您可以取消引用散列引用,从而获得键/值对的列表。然后,将来自两个已取消引用的哈希的对组合在一起,形成一个列表,该列表用于创建新的,组合的哈希。

我应该指出,这种方法存在危险。如果您的两个子例程曾经能够返回对包含相同密钥的哈希的引用,那么该重复密钥中只有一个版本会出现在组合的哈希中。