我刚遇到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提供 和和或运算符(见下文)。短路行为是 相同。 "和"的优先顺序和"或"然而,要低得多 你可以安全地在列表操作符之后使用它们而不需要它们 括号:
答案 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