首页 > 解决方案 > 散列的未知散列

问题描述

我可以使用以下 perl 代码从数据库中获取数据:

my %hash = $vars->getVarHash;   #load data into a hash
print Dumper(\%hash);

Dumper 的输出如下所示:

$VAR1 = {
          'HASH(0x55948e0b06b0)' => undef
        };

现在我知道这个散列指向一个变量的散列,并且它们每个都指向每个变量的选项列表(我猜是“散列的散列”),像这样:

HASH(0x55948e0b06b0) --> Variable_a --> Option_a_1, Option_a_2 ...
                     --> Variable_b --> Option_b_1, Option_b_2 ...
                     --> Variable_c --> ...

我如何正确取消引用此哈希,以便我可以获得变量的值并且每​​个都是选项?

标签: perlreferencehashmapdereference

解决方案


基本问题是您只能取消引用引用。哈希不是引用,因此“取消引用哈希”没有意义。

你的翻斗机输出,

$VAR1 = {
          'HASH(0x55948e0b06b0)' => undef
        };

不显示嵌套的数据结构或引用或任何东西。它实际上是一个单元素哈希,其(单个)键是字符串"HASH(0x55948e0b06b0)",其值为undef. 你对这个结构无能为力。

可能发生的情况是getVarHash返回对哈希的引用(单个值),该引用(通过分配给哈希)已隐式转换为对应值为undef. 哈希键始终是字符串,因此丢失了原始参考值。

Perl 可以告诉你这个特殊的问题。你应该总是用你的 Perl 文件开始

use strict;
use warnings;

这个特殊错误的警告是

Reference found where even-sized list expected at foo.pl line 123.

解决方案是将返回的引用存储在标量变量中:

my $hash = $vars->getVarHash;
print Dumper($hash);

然后,您可以使用所有常用方法(如 eg 中所述perldoc perlreftut)取消引用它并访问其内容,例如keys %$hash,$hash->{$key}等。


推荐阅读