仅针对具有低优先级短路运算符的{void}上下文警告

时间:2016-10-04 17:45:42

标签: perl

我刚遇到and&&在警告方面表现不同的情况。

这是原始脚本and

#!/usr/bin/env perl
use strict;
use warnings 'FATAL' => qw[all];

my $var1;
my $var2;

my $defined = (defined $var1) and (defined $var2);

print ($defined ? "defined\n" : "undefined\n");

因为第一个条件为假,所以并且永远不会评估和中的第二个表达式。

% perl defined.pl
Useless use of defined operator in void context at defined.pl line 8.
Exit 255

但是,如果我将操作更改为更高优先级但其他方面相同&&,则我不会收到无效上下文警告。

#!/usr/bin/env perl
use strict;
use warnings 'FATAL' => qw[all];

my $var1;
my $var2;

my $defined = (defined $var1) && (defined $var2);

print ($defined ? "defined\n" : "undefined\n");

该程序产生预期结果"undefined\n"

% perl defined.pl
undefined

perldoc perlop建议and&&在所有方面都应该相同,但优先级除外,但不明确说明。

  

作为&&的替代品和||当用于控制流程时,Perl提供   和和或运算符(见下文)。短路行为是   相同。 "和"的优先顺序和"或"然而,要低得多   你可以安全地在列表操作符之后使用它们而不需要它们   括号:

1 个答案:

答案 0 :(得分:12)

赋值运算符的higher precedence不是and,所以

my $defined = (defined $foo) and (defined $bar);

相当于

(my $defined = (defined $foo)) && (defined $bar);

您可以使用B::Deparse

查看此信息
$ perl -MO=Deparse -e'my $defined = (defined $foo) && (defined $bar)'                                                               
my $defined = defined $foo && defined $bar;
-e syntax OK

$ perl -MO=Deparse -e'my $defined = (defined $foo) and (defined $bar)'
defined $bar if my $defined = defined $foo;
-e syntax OK