未知的哈希哈希

时间:2018-10-04 13:03:55

标签: 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_a_2 ...
                     --> Variable_b --> Option_b_1, Option_b_2 ...
                     --> Variable_c --> ...

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

2 个答案:

答案 0 :(得分:8)

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

您的自卸车输出,

jdoe     john     doe     group1, group2   xyz

不显示嵌套的数据结构或引用或任何内容。从字面上看,这是一个单元素哈希,其(单个)键是字符串$VAR1 = { 'HASH(0x55948e0b06b0)' => undef }; ,其值是"HASH(0x55948e0b06b0)"。这种结构无能为力。

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

Perl可以告诉您有关此特定问题的信息。您应该始终使用以下方式启动Perl文件:

undef

此特定错误的警告是

use strict;
use warnings;

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

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

然后,您可以使用所有常用方法(如perldoc perlreftut中所述)取消引用并访问其内容,例如my $hash = $vars->getVarHash; print Dumper($hash); keys %$hash等。

答案 1 :(得分:1)

我不确定getVarHash()的定义位置,但是(正如其他人所说的那样)它看起来像返回的是哈希引用,而不是您所假设的哈希。

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

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

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

say $hash{foo}; # or whatever

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

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

另一种方法是取消引用该方法返回的值,以便可以将其用作哈希。

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

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