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



我正在尝试合并两个哈希。但它们是函数的返回值。如何取消内联引用返回值?我不想使用额外的变量,例如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'
}
}
};

将此行更改为

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

工作!

实际上,您的原始解决方案确实打印了两个哈希值,但第一个是"字符串化"的,因为它被用作哈希值的键。它在那里作为HASH(0x21ea4a0).

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

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

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

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

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

您真正想做的是"取消引用"您的哈希并返回实际哈希。您可以使用语法%{ ... }取消引用哈希,其中...是返回哈希引用的任何表达式。这就是您在解决方案中所做的工作。取消引用哈希引用,这将为您提供键/值对的列表。然后,来自两个取消引用的哈希值的对将连接在一个列表中,该列表用于创建新的组合哈希。

我应该指出,这种方法存在危险。如果两个子例程可以返回对包含相同键的哈希的引用,则组合哈希中将只显示该重复键的一个版本。

最新更新