我正在重新分解我继承的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);
}
我最好的猜测是,由于懒惰的评估,原始的行是有效的,如果是这样,那么写它的理性是什么?
第二,为什么这条特殊的线条会引起无用的使用......"警告?
答案 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认为&&
之后的部分是匿名哈希引用。您可以省略大括号{
和}
,因为它仍然是一个命令,警告将消失。