Perl 散列的未知散列

Perl 散列的未知散列,perl,reference,hashmap,dereference,Perl,Reference,Hashmap,Dereference,我可以使用以下perl代码从数据库中获取数据: my %hash = $vars->getVarHash; #load data into a hash print Dumper(\%hash); 转储程序的输出如下所示: $VAR1 = { 'HASH(0x55948e0b06b0)' => undef }; HASH(0x55948e0b06b0) --> Variable_a --> Option_a_1, Option_

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

my %hash = $vars->getVarHash;   #load data into a hash
print Dumper(\%hash);
转储程序的输出如下所示:

$VAR1 = {
          'HASH(0x55948e0b06b0)' => undef
        };
HASH(0x55948e0b06b0) --> Variable_a --> Option_a_1, Option_a_2 ...
                     --> Variable_b --> Option_b_1, Option_b_2 ...
                     --> Variable_c --> ...
现在我知道这个散列指向变量的散列,每个变量都指向每个变量的选项列表(我猜是“散列”),如下所示:

$VAR1 = {
          'HASH(0x55948e0b06b0)' => undef
        };
HASH(0x55948e0b06b0) --> Variable_a --> Option_a_1, Option_a_2 ...
                     --> Variable_b --> Option_b_1, Option_b_2 ...
                     --> Variable_c --> ...

如何正确地取消引用此哈希,以便获得变量值和每个is选项?

基本问题是您只能取消引用。散列不是引用,所以“取消对散列的引用”没有意义

您的转储程序输出

$VAR1 = {
          'HASH(0x55948e0b06b0)' => undef
        };
不显示嵌套的数据结构或引用或任何内容。它实际上是一个单元素散列,其(单个)键是字符串
“hash(0x55948e0b06b0)”
,其值是
undef
。你对这个结构无能为力

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

Perl可以告诉您这个特定的问题。您应该始终使用

use strict;
use warnings;
对这一特殊错误的警告是

在foo.pl第123行中找到了偶数大小的列表。

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

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

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

我不确定
getVarHash()
是在哪里定义的,但是(正如其他人所说的)它看起来像是返回一个哈希引用,而不是您假设的哈希

您可以将返回的哈希引用存储在标量中,并将其用作引用:

my $hash = $vars->getVarHash;
print Dumper($hash);
这可能是最好的方法,但它有一个缺点。如果您有访问哈希的代码:

say $hash{foo}; # or whatever
然后您需要重写它以使用哈希引用:

say $hash->{foo}; # or whatever
另一种方法是取消引用从方法返回的值,以便将其用作哈希

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

这样,代码的其余部分将按预期工作,而不进行任何更改。

看起来哈希
%hash
是未定义的:
'hash(0x55948e0b06b0)=>undef
查看“$vars->getVarHash”的文档-它返回一个哈希引用,而不是哈希。使用
my$hash=$vars->getVarHash;打印转储程序$hash代替。始终
使用严格的;使用警告。你应该得到一个关于散列作业的警告。谢谢你的帮助,非常可靠的答案,你们解决了我的问题。非常感谢,回答得很好,很遗憾,我还没有提升自己的声誉。非常感谢,这是一个很好的回答。遗憾的是,我还没有提升投票权的名声。这会打印出整个散列,这似乎是一个散列的散列,现在我只需要找出如何在数组中存储“最内部”散列的值,但即使如此,你已经给了我一个链接。我更改了问题的标题,因为你说这里取消引用没有意义