我正在尝试合并两个哈希。但是它们是函数的返回值。我如何取消内联返回值的引用?我不想使用额外的变量,例如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'
}
}
};
答案 0 :(得分:2)
将此行更改为
my $descs = {%{_makePos()}, %{_makeVel()}};
工作了!
答案 1 :(得分:1)
实际上,您的原始解决方案确实打印了两个哈希,但是第一个哈希被“字符串化”,因为它被用作哈希的键。它以HASH(0x21ea4a0)
的形式存在。
我看到您有一个解决方案,但是可能值得解释出了什么问题以及为什么您的解决方案将其解决。
您的两个子例程不返回哈希值,而是散列引用。哈希引用是一个标量值,实际上是指向哈希的指针。
从值列表创建哈希。创建新闻哈希(实际上又是哈希引用)的代码是这样的:
my $descs = {_makePos(), _makeVel()};
这是两个标量值。第一个用作新哈希中的键,第二个用作关联值-因此,您从Data::Dumper
获得的结果。
您真正想要做的是“取消引用”您的哈希并返回到实际的哈希。您可以使用语法%{ ... }
取消引用哈希,其中...
是返回哈希引用的任何表达式。这就是您在解决方案中所做的。您可以取消引用散列引用,从而获得键/值对的列表。然后,将来自两个已取消引用的哈希的对组合在一起,形成一个列表,该列表用于创建新的,组合的哈希。
我应该指出,这种方法存在危险。如果您的两个子例程曾经能够返回对包含相同密钥的哈希的引用,那么该重复密钥中只有一个版本会出现在组合的哈希中。