perl - 无法正确合并哈希

标签 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 的引用,这在阅读您的回复后显而易见。

最佳答案

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

您的变量名称 %ref 以及您正在使用 {} 的事实有点暗示您需要此处的引用。

让我们看看我们将在 %ref 中得到什么值。考虑这个例子。

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

这将在我的 Perl 5.20.2 上发出警告 Reference found where even-sized list expected。输出将是:

{
    HASH(0x7e33c0)   undef
}

它是一个以 hashref 为键、以 undef 为值的散列。 HASH(0x07e33c0) 是您查看哈希引用而不取消引用时得到的结果。 ({} 在那里是因为 Data::Printer 将散列转换为散列引用)。

回到您的代码,引用的正确标记是 $。它是什么类型的引用并不重要。引用始终是标量(指向内存中存储哈希/数组/某物的位置的指针)。

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

现在您已经获得了一个哈希引用,其值为 $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 的Learning Perl 和 Curtis Poe 的Beginning Perl 对此都非常有帮助

关于perl - 无法正确合并哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30600445/

相关文章:

c++ - 在 perl 和 cpp 之间共享数据结构

perl - 使用另一个哈希值定义一个哈希值。

perl - Perl 中存储表格数据的最佳数据结构是什么?

perl - 使用 WWW::Mechanize 重定向登录网站

c - "Inline C"- 问题

perl - sed、awk 或 perl : Pattern range match, 打印 45 行然后添加记录分隔符

perl - 如何使用 Perl 逐行读取仅 CR 的文件?

珀尔 :Out of Memory Error while building a 2d array at run time

perl - 向哈希添加一个空数组

perl - 如何从 Perl 中的哈希中删除键?