Perl 的 ( or, and ) 和 ( ||, && ) 短路运算符有啥区别?

Posted

技术标签:

【中文标题】Perl 的 ( or, and ) 和 ( ||, && ) 短路运算符有啥区别?【英文标题】:What is the difference between Perl's ( or, and ) and ( ||, && ) short-circuit operators?Perl 的 ( or, and ) 和 ( ||, && ) 短路运算符有什么区别? 【发布时间】:2010-12-03 12:13:18 【问题描述】:

这些子例程中哪一个不像另一个?

sub or1 
    my ($a,$b) = @_;
    return $a || $b;


sub or2 
    my ($a,$b) = @_;
    $a || $b;


sub or3 
    my ($a,$b) = @_;
    return $a or $b;


sub or4 
    my ($a,$b) = @_;
    $a or $b;

我从 C 和 Perl 4 来到 Perl 5 并一直使用 || 直到我看到更多使用 or 的脚本并且我喜欢它的外观。但正如上面的测验所示,对于粗心的人来说,它并非没有陷阱。对于同时使用这两种构造或大量使用or 的人,您使用什么经验法则来决定使用哪个构造并确保代码按照您的想法执行?

【问题讨论】:

我愿意花 200 美元搞定日美关系,特雷贝克。 What is the difference between "||" and "or" in Perl?的可能重复 【参考方案1】:

由于'or'运算符的优先级较低,or3解析如下:

sub or3 
    my ($a,$b) = @_;
    (return $a) or $b;

通常的建议是只对控制流使用“或”运算符:

@info = stat($file) or die;

更多讨论请参见 perl 手册:http://perldoc.perl.org/perlop.html#Logical-or-and-Exclusive-Or

【讨论】:

'or' 运算符的优先级甚至低于赋值运算符,所以要小心。【参考方案2】:

您使用什么经验法则来决定要使用哪个构造并确保代码正在执行您认为正在执行的操作

operator precedence 规则。

|| 绑定紧密,or 绑定较弱。没有“经验法则”。

如果你必须有一个经验法则,那么“只有在没有左值时才使用or”怎么样:

or:

open my $fh, '>', 'file' or die "Failed to open file: $!"

||:

my $greeting = greet() || $fallback || 'OH HAI';

我同意 MJD 关于避免使用括号的观点;如果您不知道规则,请查一下……但请不要写(open(my $fh, '>', 'file')) or (die("Failed to open file: $!"))“只是为了确定”。

【讨论】:

【参考方案3】:

在 Perl 5 中,“or”和“and”的优先级低于“||”和 ”&&”。查看这个 PerlMonks 线程以获取更多信息:

http://www.perlmonks.org/?node_id=155804

【讨论】:

【参考方案4】:

这两个版本在 Perl 中都是短路的,但“文本”形式(“and”和“or”)的优先级低于其 C 风格的等效形式。

http://www.sdsc.edu/~moreland/courses/IntroPerl/docs/manual/pod/perlop.html#Logical_And

【讨论】:

【参考方案5】:

我的猜测是 or3 是不同的。

我不是真正的 Perl 人,但看起来 1、2 和 4 都明确返回布尔值。我猜 3 有副作用,比如返回 $a 或类似的东西。

往下看

嘿,我是对的。

【讨论】:

正确,但你没有说为什么。 @Ether:我不知道为什么。 :P 猜谜游戏你赢了!

以上是关于Perl 的 ( or, and ) 和 ( ||, && ) 短路运算符有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

and和or的用法和区别

英语中一般疑问句or和and的区别

if和and /or 函数的运用?

条件查询中的多or和and条件结合

and和or运算

在Scheme中,'or'和'and'会短路吗?