4

「プログラミング Perl 」を読んでいて、意味をなさないように見える奇妙な例に出くわしました。この本では、Perl のコンマ演算子がスカラー コンテキストで使用されたときに最後の結果のみを返す方法について説明しています。

例:

# After this statement, $stuff = "three"
$stuff = ("one", "two", "three");

この本は、数ページ後に「逆コンマ演算子」の例を示しています (82 ページ)。

# A "reverse comma operator".
return (pop(@foo), pop(@foo))[0];

しかし、私にはこれはまったく逆ではないようです..?

例:

# After this statement, $stuff = "three"
$stuff = reverse_comma("one", "two", "three");

# Implementation of the "reverse comma operator"
sub reverse_comma {
    return (pop(@_), pop(@_))[0];
}

これは、通常のカンマ演算子とは逆の方法でしょうか? 結果は同じで、逆ではありません。

こちらが正確なページへのリンクです。例は一番下にあります。

4

4 に答える 4

8

これは悪い例であり、忘れる必要があります。

それが実証していることは単純です:

  • 通常、スカラー コンテキストでコンマで区切られた一連の式がある場合、それはコンマ演算子のインスタンスとして解釈でき、シーケンスの最後のものに評価されます。

  • ただし、そのシーケンスを括弧に入れて[0]最後に貼り付けると、そのシーケンスがリストに変換され、最初の要素が取得されます。

    my $x = (1, 2, 3)[0];
    

    何らかの理由で、本はこれを「逆カンマ演算子」と呼んでいます。これは誤称です。それは、最初の要素が取得された単なるリストです。

この本は、引数で関数を 2 回使用することで、問題をさらに混乱させています。popこれらは左から右に評価されるため、最初のpop評価は に評価され"three"、2 番目の評価は に評価され"two"ます。

いずれにせよ: 実際のコードではコンマまたは「逆コンマ」演算子を使用しないでください。どちらも、将来の読者にとって混乱を招く可能性があります。

于 2016-04-25T20:01:19.560 に答える
2

例をもっと似たものにしましょう。

コンマ演算子:

$scalar = ("one", "two", "three");
# $scalar now contains "three"

逆コンマ演算子:

$scalar = ("one", "two", "three")[0];
# $scalar now contains "one"

$scalar通常のコンマ演算子が最後の式を与える最初の式の結果を取得するため、これは「逆コンマ」です。(Lisp について何か知っているなら、それは と の違いのようなものprognですprog1。)

サブルーチンとしての「逆コンマ演算子」の実装は、次のようになります。

sub reverse_comma {
    return shift @_;
}
于 2016-04-25T20:38:17.707 に答える