33

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

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使用 .

4

5 回答 5

42

由于 '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

于 2009-10-03T01:55:59.177 回答
18

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

运算符优先级规则。

||紧密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: $!"))“只是为了确定”。

于 2009-10-03T03:35:10.797 回答
8

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

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

于 2009-10-03T01:53:11.130 回答
2

我的猜测是 or3 是不同的。

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

向下看

嘿,我是对的。

于 2009-10-03T01:46:49.840 回答
2

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

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

于 2009-10-03T01:53:06.230 回答