已弃用"不能使用哈希作为参考"遗留代码中的perl错误

时间:2017-07-31 20:54:27

标签: perl hash reference deprecated

我们有一些遗留代码抛弃了"无法使用哈希作为参考" 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包含在内以供参考。

原作者试图做的是否明确,是否有明显的解决办法可以一劳永逸地解决这个问题?

感谢。

2 个答案:

答案 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中的引用),我们使用\ (以引用我们刚刚获得的哈希值),然后可以->{...}正确地解除引用(再次)。)

对于未来,盲目地沉默警告通常不是一个好主意,特别是如果他们告诉你代码中的错误。