我可以使用以下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 --> ...我如何正确地取消引用这个哈希,以便我可以得到变量和每个is选项的值?
发布于 2018-10-04 13:37:51
基本的问题是您只能取消引用。散列不是引用,因此“取消引用散列”没有意义。
你的翻斗车输出,
$VAR1 = {
'HASH(0x55948e0b06b0)' => undef
};不显示嵌套的数据结构或引用或其他任何内容。它实际上是一个单元素散列,其(单)键为字符串"HASH(0x55948e0b06b0)",其值为undef。用这个结构你什么也做不了。
可能发生的情况是,getVarHash返回对哈希(单个值)的引用,通过将该值分配给哈希,您已经隐式地将其转换为相应值为undef的键。散列键总是字符串,因此原始引用值丢失了。
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}等。
发布于 2018-10-04 13:56:42
我不知道getVarHash()是在哪里定义的,但是(就像其他人说的那样),它似乎返回一个哈希引用,而不是您假设的哈希。
可以将返回的散列引用存储在标量中,并将其用作引用:
my $hash = $vars->getVarHash;
print Dumper($hash);这可能是最好的方法,但它有一个缺点。如果有访问哈希的代码:
say $hash{foo}; # or whatever然后,您需要重写它来使用散列引用:
say $hash->{foo}; # or whatever另一种方法是取消引用该方法返回的值,以便您可以将其用作哈希。
my %hash = %{ $vars->getVarHash };这样,您的其余代码将按预期工作而不进行更改。
https://stackoverflow.com/questions/52647468
复制相似问题