我可以使用以下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 --> ...
我如何正确地取消引用此哈希,以便获取变量的值以及每个选项的值?
答案 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 };
这样,您的其余代码将按预期运行,而无需进行更改。