我正好遇到一种情况,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)
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |