web-dev-qa-db-ja.com

Perlの(or、and)と(||、&&)短絡演算子の違いは何ですか?

これらのサブルーチンのうち、他のものと異なるものはどれですか。

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を大量に使用する人にとって、どの構成体を使用してどの構成体を使用するかを決定し、コードが意図したとおりに機能することを確認しますか?

30
mob

「or」演算子の優先順位が低いため、or3は次のように解析します。

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

通常のアドバイスは、制御フローに 'or'演算子のみを使用することです:

@info = stat($file) or die;

詳細については、Perlのマニュアルを参照してください。 http://perldoc.Perl.org/perlop.html#Logical-or-and-Exclusive-Or

41
Igor ostrovsky

使用する構成を決定し、コードが意図したとおりに動作していることを確認するために使用する経験則

演算子の優先順位 ルール。

||は強く結合し、orは弱く結合します。 「経験則」はありません。

経験則が必要な場合は、「lvalueがない場合にのみ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: $!"))「念のために」お願いします。

18
jrockway

Perl 5では、「or」と「and」は「||」よりも優先順位が低くなっています。および「&&」。詳細については、このPerlMonksスレッドを確認してください。

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

6
perimosocordiae

Or3は違うと思います。

私は実際にはPerlの人ではありませんが、1、2、および4はすべて明示的にブール値を返すように見えます。 3には$ aを返すなどの副作用があると思います。

下向き

ねえ、私は正しかった。

1
Stefan Kendall

どちらのバージョンもPerlでは短絡的ですが、「テキスト」形式(「and」および「or」)は、Cスタイルの同等のものよりも優先順位が低くなっています。

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

1
Ed S.