首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >散列散列的未知散列

散列散列的未知散列
EN

Stack Overflow用户
提问于 2018-10-04 13:03:54
回答 2查看 258关注 0票数 2

我可以使用以下perl代码从数据库中获取数据:

代码语言:javascript
复制
my %hash = $vars->getVarHash;   #load data into a hash
print Dumper(\%hash);

Dumper的输出如下所示:

代码语言:javascript
复制
$VAR1 = {
          'HASH(0x55948e0b06b0)' => undef
        };

现在我知道这个散列指向变量的散列,每个变量指向每个变量的选项列表(我猜是“散列”),如下所示:

代码语言:javascript
复制
HASH(0x55948e0b06b0) --> Variable_a --> Option_a_1, Option_a_2 ...
                     --> Variable_b --> Option_b_1, Option_b_2 ...
                     --> Variable_c --> ...

我如何正确地取消引用这个哈希,以便我可以得到变量和每个is选项的值?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-04 13:37:51

基本的问题是您只能取消引用。散列不是引用,因此“取消引用散列”没有意义。

你的翻斗车输出,

代码语言:javascript
复制
$VAR1 = {
          'HASH(0x55948e0b06b0)' => undef
        };

不显示嵌套的数据结构或引用或其他任何内容。它实际上是一个单元素散列,其(单)键为字符串"HASH(0x55948e0b06b0)",其值为undef。用这个结构你什么也做不了。

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

Perl可以告诉您这个特定的问题。您应该始终使用

代码语言:javascript
复制
use strict;
use warnings;

对这一特殊错误的警告是

代码语言:javascript
复制
Reference found where even-sized list expected at foo.pl line 123.

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

代码语言:javascript
复制
my $hash = $vars->getVarHash;
print Dumper($hash);

然后,您可以使用所有常用的方法(如perldoc perlreftut中所描述的)来取消引用并访问其内容,如keys %$hash$hash->{$key}等。

票数 8
EN

Stack Overflow用户

发布于 2018-10-04 13:56:42

我不知道getVarHash()是在哪里定义的,但是(就像其他人说的那样),它似乎返回一个哈希引用,而不是您假设的哈希。

可以将返回的散列引用存储在标量中,并将其用作引用:

代码语言:javascript
复制
my $hash = $vars->getVarHash;
print Dumper($hash);

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

代码语言:javascript
复制
say $hash{foo}; # or whatever

然后,您需要重写它来使用散列引用:

代码语言:javascript
复制
say $hash->{foo}; # or whatever

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

代码语言:javascript
复制
my %hash = %{ $vars->getVarHash };

这样,您的其余代码将按预期工作而不进行更改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52647468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档