为什么这段代码会在void context"中使用匿名哈希({})。警告。

时间:2014-07-02 15:36:43

标签: perl

我正在重新分解我继承的Perl程序。以下一行

(! exists $self->{DEVEL}) &&  { @$d = $nsaobj->filter_list(@$d) };

发出以下警告......

Useless use of anonymous hash ({}) in void context...

首先,我想了解这里发生的事情。我是否认为这只是写下面陈述的另一种方式?

if (! exists $self->{DEVEL}) {
   @$d = $nsaobj->filter_list(@$d);
}

我最好的猜测是,由于懒惰的评估,原始的行是有效的,如果是这样,那么写它的理性是什么?

第二,为什么这条特殊的线条会引起无用的使用......"警告?

2 个答案:

答案 0 :(得分:4)

  

首先,我想了解这里发生的事情。我是否认为这只是写下面陈述的另一种方式?

是的,这似乎是原始代码的意图,但这并不完全是它正在做的事情。 Perl的警告是正确的。原作者可能打算写

(! exists $self->{DEVEL}) && do { @$d = $nsaobj->filter_list(@$d); };

do是这里的重要部分,因为它表示执行后续块。如果没有do,Perl会创建一个内容为@$d的匿名哈希引用,但该值不会绑定到任何变量,因此会出现警告。如果@$d最终成为具有奇数个元素的数组,它甚至可能导致运行时错误。

如果希望将其保持为单行,这将是一个更典型的构造

@$d = $nsaobj->filter_list(@$d) unless exists $self->{DEVEL};

答案 1 :(得分:0)

Perl认为&&之后的部分是匿名哈希引用。您可以省略大括号{},因为它仍然是一个命令,警告将消失。