哈希的未知哈希

Unknown Hash of Hashes of Hashes

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

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

Dumper 的输出如下所示:

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

现在我知道这个散列指向变量的散列,每个变量都指向每个变量的选项列表(我猜是 "hash of hashes"),像这样:

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

我如何正确取消引用此散列以便我可以获得变量的值和每个选项?

基本问题是您只能解引用引用。散列不是引用,因此 "dereference a hash" 没有意义。

你的垃圾车输出,

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

不显示嵌套数据结构或引用或任何内容。它实际上是一个单元素散列,其(单个)键是字符串 "HASH(0x55948e0b06b0)",其值是 undef。使用此结构您无能为力。

可能发生的事情是 getVarHash returns 对散列(单个值)的引用,它(通过分配给散列)隐式转换为对应值的键是 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);

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

我不确定 getVarHash() 在哪里定义,但是(正如其他人所说)它看起来像 returns 一个散列引用,而不是你假设的散列。

您可以将返回的散列引用存储在标量中并将其用作引用:

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

这可能是最好的方法,但它有一个缺点。如果您有访问哈希的代码:

say $hash{foo}; # or whatever

然后您需要重写它以改用哈希引用:

say $hash->{foo}; # or whatever

另一种方法是取消引用从该方法返回的值,以便您可以将其用作散列。

my %hash = %{ $vars->getVarHash };

这样,您的其余代码将按预期工作而无需进行更改。