Perl 散列的未知散列
我可以使用以下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_
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代码>代替。始终使用严格的;使用警告代码>。你应该得到一个关于散列作业的警告。谢谢你的帮助,非常可靠的答案,你们解决了我的问题。非常感谢,回答得很好,很遗憾,我还没有提升自己的声誉。非常感谢,这是一个很好的回答。遗憾的是,我还没有提升投票权的名声。这会打印出整个散列,这似乎是一个散列的散列,现在我只需要找出如何在数组中存储“最内部”散列的值,但即使如此,你已经给了我一个链接。我更改了问题的标题,因为你说这里取消引用没有意义