我们有一些遗留代码抛弃了"无法使用哈希作为参考" perl错误。之前的"修复"是关闭警告,但新的perl使警告成为一个严重的错误,所以现在有人真正解决了这个问题。
代码看起来像这样......
foreach my $a (keys %{$x->{'y'}}) {
my $b = %$x->{'y'}->{$a};
<some other stuff>
}
我的理解是,像%j-&gt; {&#39; k&#39;}这样的东西应该转换为$ j {&#39; k&#39;},但带有两个指针的%$东西是因为我只能在最一般的层面上理解这一点,所以我能够处理的比这更多。
似乎只有循环中的行导致错误,但我将foreach包含在内以供参考。
原作者试图做的是否明确,是否有明显的解决办法可以一劳永逸地解决这个问题?
感谢。
答案 0 :(得分:3)
只需删除%就可以了。我无法想象其他任何可能意味着什么。
答案 1 :(得分:1)
看起来这个想法是迭代$x->{'y'}
引用的哈希中的条目。 foreach
循环依次将$a
设置为每个键。然后循环体将相应的值分配给$b
。
从keys
表达式中我们可以看到$x
必须包含对哈希的引用,并且键'y'
下的值必须是对另一个哈希的引用。从那里你可以通过
$a
下的值
my $b = $x->{'y'}->{$a};
# or:
my $b = $x->{y}{$a}; # if you don't like typing
原始代码的问题是%$x->{...}
部分。 %$x
取消引用$x
中的引用,因此您获得的结果是实际哈希值。然后->{...}
运算符再次尝试取消引用它,这没有任何意义(正如错误消息所示,哈希不是引用)。只需删除%
并让->{...}
完成工作。
(或者,如果您感到疯狂,可以(\%$x)->{'y'}->{$a}
。除了%
(要取消引用$x
中的引用),我们使用\
(以引用我们刚刚获得的哈希值),然后可以->{...}
正确地解除引用(再次)。)
对于未来,盲目地沉默警告通常不是一个好主意,特别是如果他们告诉你代码中的错误。