【问题标题】:deprecated "Can't use a hash as a reference" perl error in legacy code旧代码中已弃用“不能使用哈希作为参考”perl 错误
【发布时间】:2018-01-07 13:41:39
【问题描述】:

我们有一些遗留代码抛出“不能使用哈希作为参考”perl 错误。之前的“修复”是关闭警告,但是新的 perl 已经将警告变成了一个硬错误,所以现在必须有人真正修复这个问题。

代码看起来像这样...

foreach my $a (keys %{$x->{'y'}}) {
        my $b = %$x->{'y'}->{$a};
        <some other stuff>
}

我的理解是像%j->{'k'}这样的东西应该转换成$j{'k'},但是有两个指针的%$东西我处理不了了,因为我只懂这是最一般的级别。

似乎只有循环内的行导致错误,但我将 foreach 包括在内以供参考。

是否清楚原作者试图做什么?是否有明显的修复方法可以一劳永逸地解决这个问题?

谢谢。

【问题讨论】:

  • $x 是一个散列reference(根据使用情况判断)。要从中检索键的值,我们取消引用它,如$x-&gt;{key}。具体不像 %$x-&gt;{}。 (很久以前有效。)只有当我们说%$x(比如keys)时才需要整个哈希。在这里,您的散列具有值的散列引用,因此 keys %$x-&gt;{y} 将这些值解引用为散列,$x-&gt;{y}-&gt;{$a} 从这些散列引用之一($a 之一)中获取一个值。

标签: perl hash reference deprecated


【解决方案1】:

只要去掉 % 就可以了。我无法想象还有什么意思。

【讨论】:

  • 哈,就是这样。这就是我过度思考标点符号的结果。谢谢一百万!
【解决方案2】:

看起来这个想法是迭代 $x-&gt;{'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-&gt;{...} 部分。 %$x 取消引用 $x 中的引用,因此您得到的是一个实际的哈希值。 -&gt;{...} 运算符然后尝试再次取消引用它,这是没有意义的(正如错误消息所说,哈希不是引用)。只需删除 % 并让 -&gt;{...} 完成工作。

(或者,如果您觉得很疯狂,您可以使用(\%$x)-&gt;{'y'}-&gt;{$a}。除了%(取消引用$x 中的引用),我们使用\(引用哈希我们刚刚得到),然后可以被-&gt;{...}正确地(再次)取消引用。)


对于未来,盲目地消除警告通常不是一个好主意,尤其是当它们告诉您代码中的错误时。

【讨论】:

  • 完全同意您对警告的评论,但我迟到了。谢谢你的解释!
  • 公平地说,这不是一个错误,确切地说。这是一个无意的功能,使其首先工作,后来被弃用,后来又被删除。但这更加强调了这一点:永远不要忽视弃用警告;以前的东西会永远被弃用,但现在 perl 正在努力在合理的时间内实际删除弃用的东西。
猜你喜欢
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 2017-11-24
  • 2011-03-16
  • 2014-03-31
  • 2021-05-09
相关资源
最近更新 更多