哈希的未知哈希
Unknown Hash of Hashes of Hashes
我可以使用以下 perl 代码从数据库中获取数据:
my %hash = $vars->getVarHash; #load data into a hash
print Dumper(\%hash);
Dumper 的输出如下所示:
$VAR1 = {
'HASH(0x55948e0b06b0)' => undef
};
现在我知道这个散列指向变量的散列,每个变量都指向每个变量的选项列表(我猜是 "hash of hashes"),像这样:
HASH(0x55948e0b06b0) --> Variable_a --> Option_a_1, Option_a_2 ...
--> Variable_b --> Option_b_1, Option_b_2 ...
--> Variable_c --> ...
我如何正确取消引用此散列以便我可以获得变量的值和每个选项?
基本问题是您只能解引用引用。散列不是引用,因此 "dereference a hash" 没有意义。
你的垃圾车输出,
$VAR1 = {
'HASH(0x55948e0b06b0)' => undef
};
不显示嵌套数据结构或引用或任何内容。它实际上是一个单元素散列,其(单个)键是字符串 "HASH(0x55948e0b06b0)"
,其值是 undef
。使用此结构您无能为力。
可能发生的事情是 getVarHash
returns 对散列(单个值)的引用,它(通过分配给散列)隐式转换为对应值的键是 undef
。哈希键始终是字符串,因此丢失了原始参考值。
Perl 可以告诉您有关这个特定问题的信息。您应该始终以
开头您的 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}
等
我不确定 getVarHash()
在哪里定义,但是(正如其他人所说)它看起来像 returns 一个散列引用,而不是你假设的散列。
您可以将返回的散列引用存储在标量中并将其用作引用:
my $hash = $vars->getVarHash;
print Dumper($hash);
这可能是最好的方法,但它有一个缺点。如果您有访问哈希的代码:
say $hash{foo}; # or whatever
然后您需要重写它以改用哈希引用:
say $hash->{foo}; # or whatever
另一种方法是取消引用从该方法返回的值,以便您可以将其用作散列。
my %hash = %{ $vars->getVarHash };
这样,您的其余代码将按预期工作而无需进行更改。
我可以使用以下 perl 代码从数据库中获取数据:
my %hash = $vars->getVarHash; #load data into a hash
print Dumper(\%hash);
Dumper 的输出如下所示:
$VAR1 = {
'HASH(0x55948e0b06b0)' => undef
};
现在我知道这个散列指向变量的散列,每个变量都指向每个变量的选项列表(我猜是 "hash of hashes"),像这样:
HASH(0x55948e0b06b0) --> Variable_a --> Option_a_1, Option_a_2 ...
--> Variable_b --> Option_b_1, Option_b_2 ...
--> Variable_c --> ...
我如何正确取消引用此散列以便我可以获得变量的值和每个选项?
基本问题是您只能解引用引用。散列不是引用,因此 "dereference a hash" 没有意义。
你的垃圾车输出,
$VAR1 = {
'HASH(0x55948e0b06b0)' => undef
};
不显示嵌套数据结构或引用或任何内容。它实际上是一个单元素散列,其(单个)键是字符串 "HASH(0x55948e0b06b0)"
,其值是 undef
。使用此结构您无能为力。
可能发生的事情是 getVarHash
returns 对散列(单个值)的引用,它(通过分配给散列)隐式转换为对应值的键是 undef
。哈希键始终是字符串,因此丢失了原始参考值。
Perl 可以告诉您有关这个特定问题的信息。您应该始终以
开头您的 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}
等
我不确定 getVarHash()
在哪里定义,但是(正如其他人所说)它看起来像 returns 一个散列引用,而不是你假设的散列。
您可以将返回的散列引用存储在标量中并将其用作引用:
my $hash = $vars->getVarHash;
print Dumper($hash);
这可能是最好的方法,但它有一个缺点。如果您有访问哈希的代码:
say $hash{foo}; # or whatever
然后您需要重写它以改用哈希引用:
say $hash->{foo}; # or whatever
另一种方法是取消引用从该方法返回的值,以便您可以将其用作散列。
my %hash = %{ $vars->getVarHash };
这样,您的其余代码将按预期工作而无需进行更改。