Perl(或,和)和(||,&&)短路运营商之间有什么区别?

mob*_*mob 30 perl short-circuiting

哪些子程序与其他子程序不一样?

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;
}
Run Code Online (Sandbox Code Playgroud)

我从C和Perl 4来到Perl 5并一直使用,||直到我看到更多的脚本使用or,我喜欢它的样子.但正如上面的测验所显示的那样,对于那些粗心大意的人来说,这并非没有缺陷.对于同时使用这两种结构或者使用很多结构的人来说or,您使用什么经验法则来决定使用哪种结构并确保代码正在执行您认为正在执行的操作?

Igo*_*sky 41

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

sub or3 {
    my ($a,$b) = @_;
    (return $a) or $b;
}
Run Code Online (Sandbox Code Playgroud)

通常的建议是仅使用'或'运算符来控制流程:

@info = stat($file) or die;
Run Code Online (Sandbox Code Playgroud)

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


jro*_*way 18

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

运算符优先级规则.

||紧紧or束缚,弱势结合.没有"经验法则".

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

or:

open my $fh, '>', 'file' or die "Failed to open file: $!"
Run Code Online (Sandbox Code Playgroud)

||:

my $greeting = greet() || $fallback || 'OH HAI';
Run Code Online (Sandbox Code Playgroud)

我同意MJD关于避免parens; 如果您不了解规则,请查看它们......但请不要写(open(my $fh, '>', 'file')) or (die("Failed to open file: $!"))"只是为了确定".


per*_*iae 6

在Perl 5中,"或"和"和"的优先级低于"||" 和"&&".查看此PerlMonks线程以获取更多信息:

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