无法正确合并哈希值

时间:2015-06-02 15:34:13

标签: perl perl-data-structures

我目前有以下

# $dog, $cat, $rat are all hash refs

                my %rethash = ('success' => 'Your Cool'); 

                my %ref ={ 'dog' => $dog,  'cat' => $cat,  'mouse' => $rat,
                                'chicken' => ''  };

                my $perlobj = ( \%ref,\%rethash );      

当转储$ perlobj时,这是结果

 $VAR1 = {
      'success' => 'Your Cool'
    };

但是,当启用警告时,我收到以下消息

Useless use of reference constructor in void context at ..

我意识到使用{}分配%ref的方法存在严重错误,这段代码有什么问题?我似乎无法摆脱这种警告......

编辑: 好吧我想我发现了什么,

my $perlobj = ( \%ref,\%rethash );

这不合并但会导致$ perlobj成为%rethash的引用,这在阅读你的回复后就很明显了。

2 个答案:

答案 0 :(得分:5)

RobEarl所说的是正确的。我将对此进行解释并添加更多内容。

您的变量名称%ref以及您使用{}的事实意味着您需要此处的引用。

让我们来看看我们在%ref中会有什么价值。考虑这个例子。

use strict; use warnings;
use Data::Printer;
my %foo = { key => 'value' };
p %foo;

这会在我的Perl 5.20.2上发出一个警告 Reference,其中包含预期的大小列表。输出将是:

{
    HASH(0x7e33c0)   undef
}

这是一个散列,其中hashref为键,undef为值。 HASH(0x07e33c0)是您在不解除引用的情况下查看哈希引用时获得的内容。 ({}就在那里,因为Data :: Printer将哈希转换为hashref。)

回到你的代码,正确的参考信号是$。它是什么样的参考并不重要。引用始终是一个标量(指向存储器中存储散列/数组/内容的位置的指针)。

my $ref = { 
  dog     => $dog,
  cat     => $cat,
  mouse   => $rat,
  chicken => '', # maybe this should be undef?
};

现在您的hashref值为$dog$cat$rat和空字符串。

现在你要分配一个名为$perlobj的变量,这意味着它是一个对象。相反,您将使用列表分配标量变量($使其成为标量)。如果你这样做,Perl只会为变量分配最右边的值。

my $foo = (1, 2, 3); # $foo will be 3 and there's a warning

您正在分配两个参考的列表。第一个被忽略,只有\$rethash被分配。这很方便,因为$perlobj是标量,引用也是标量。所以现在$perlobj%rethash的引用。这就是你的Data :: Dumper输出看起来像%rethash

的原因

我不确定你想做什么,所以我无法真正帮助你。我建议你阅读一些内容。

  • perlreftut有助于了解参考的工作原理
  • 如果您想进行面向对象编程,请查看Moose
  • 获取一本书来学习更多关于基本Perl的内容可能也很有用。 Randal L. Schwartz的学习Perl 和Curtis Poe的 Beginning Perl 都非常有用

答案 1 :(得分:2)

您正在获取哈希引用列表并将它们分配给标量

my $perlobj = ( \%ref, \%rethash );  # same as  $perlobj = \%rethash

相反,您想要引用哈希合并

my $perlobj = { %ref, %rethash };