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;
}

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

@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 ではショートサーキットですが、「テキスト」形式 (「and」および「or」) は C スタイルの同等のものよりも優先順位が低くなります。

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

于 2009-10-03T01:53:06.230 に答える