例如,如果$do eq 'b'
我需要匹配一些文字。
如果我运行此代码:
if (($do eq 'b') && (/text/))
{
do stuff
}
如果第一个括号为假,那么Perl会评估第一个括号和第二个括号,无论它在第二个括号的评估中停止了什么或者它会停止吗?
后续问题here。 (我不知道是否应该提出新问题或在此发布)
答案 0 :(得分:7)
是。此行为通常用于idiomatic perl。
考虑:
open FILE, ">$fname" or die $!;
如果打开文件没有错误(open
返回true),则不执行die
语句。这不是die
例程的特殊处理;它只是perl处理逻辑评估的方式。
答案 1 :(得分:4)
是的,Perl将逻辑运算符短路。这意味着它们可用于控制流程:
say "foo" if $bar;
与
相同$bar and say "foo";
和
if ($cond) { stuff() }
与
相同$cond and do { stuff() }
然而,if
的整个条件必须包含在parens中,以此作为例子
if ($do eq 'b' && /text/) {
do stuff;
}
(&&
与and
相同,但优先级更高)
答案 2 :(得分:4)
简短回答:它停止(AJ指出“短路”)。您可以获得更多详细信息here。
答案 3 :(得分:4)
是。此行为在perlop documentation中被称为短路(强调添加)。
C风格的逻辑和
二进制
&&
执行短路逻辑AND操作。也就是说,如果左操作数为假,则甚至不评估右操作数。标量或列表上下文如果被计算,则向下传播到右操作数。C风格的逻辑或
二进制
||
执行短路逻辑OR运算。也就是说,如果左操作数为true,则甚至不评估右操作数。标量或列表上下文如果被计算,则向下传播到右操作数。
除&&
和||
之外,其优先级较低的同类and
和or
也会短路。
Perl有一个xor
运算符,但由于exclusive-or的定义,它不能短路。
答案 4 :(得分:2)
这将是
if ($do eq 'b' && /text/) {
do stuff
}
是 - 如果$do eq 'b'
为false,则不会评估/text/
。
答案 5 :(得分:2)
不,当左侧部分为false
,
if ($do eq 'b' && /text/)
{
do stuff
}