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

Gre*_*bet 7 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");
Run Code Online (Sandbox Code Playgroud)

因为第一个条件是假的,所以和的第二个表达式永远不会被评估.

% perl defined.pl
Useless use of defined operator in void context at defined.pl line 8.
Exit 255
Run Code Online (Sandbox Code Playgroud)

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

#!/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");
Run Code Online (Sandbox Code Playgroud)

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

% perl defined.pl
undefined
Run Code Online (Sandbox Code Playgroud)

perldoc perlop建议and&&应在除优先级所有方面完全相同,但没有明确说明它.

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

Thi*_*Not 12

赋值运算符的优先级高于and,因此

my $defined = (defined $foo) and (defined $bar);
Run Code Online (Sandbox Code Playgroud)

相当于

(my $defined = (defined $foo)) && (defined $bar);
Run Code Online (Sandbox Code Playgroud)

你可以用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
Run Code Online (Sandbox Code Playgroud)