无法正确合并哈希值

ing*_*eni 2 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 );      
Run Code Online (Sandbox Code Playgroud)

当$ perlobj被转储时,这就是结果

 $VAR1 = {
      'success' => 'Your Cool'
    };
Run Code Online (Sandbox Code Playgroud)

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

Useless use of reference constructor in void context at ..
Run Code Online (Sandbox Code Playgroud)

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

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

my $perlobj = ( \%ref,\%rethash );
Run Code Online (Sandbox Code Playgroud)

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

sim*_*que 5

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

你的变量名%ref和你正在使用的事实{}暗示你想在这里引用.

让我们来看看我们将拥有什么样的价值%ref.考虑这个例子.

use strict; use warnings;
use Data::Printer;
my %foo = { key => 'value' };
p %foo;
Run Code Online (Sandbox Code Playgroud)

这将抛出一个警告参考文献中找到了我的Perl 5.20.2上预期的偶数大小的列表.输出将是:

{
    HASH(0x7e33c0)   undef
}
Run Code Online (Sandbox Code Playgroud)

它是一个散列,其中hashref作为键和undef值.HASH(0x07e33c0)是你在没有解除引用的情况下查看哈希引用时得到的结果.({}因为Data :: Printer将哈希值转换为hashref).

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

my $ref = { 
  dog     => $dog,
  cat     => $cat,
  mouse   => $rat,
  chicken => '', # maybe this should be undef?
};
Run Code Online (Sandbox Code Playgroud)

现在你已经有了用的值hashref $dog,$cat,$rat和一个空字符串.

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

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

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


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

  • perlreftut对于学习引用如何工作很有用
  • 如果您想进行面向对象编程,请查看Moose
  • 获得一本书来学习更多关于基本Perl的知识可能也很有用.Randal L. Schwartz 学习Perl和Curtis Poe的Beginning Perl都非常好