2

perlop: Smartmatch-Operatorによると、次のコード:

use 5.012;

my @array = qw/1 2/;

print @array ~~ 2
    ? "true"
    : "false";

ルールを使用する必要があります

Left Right 説明と擬似コード
=========================================== ==================

Any Num 数値等価 (例: Any == Num)

しかし、出力は「false」です。しかし、私は思う

@array == 2

true である必要があります。どこが間違っていますか?

4

1 に答える 1

5

この質問についてはよくわかりませんが、おそらくこれが役立ちます。コードは配列refとのスマートマッチにコンパイルされます:

$ perl -MO=Deparse -e '@a = (1, 2); print @a ~~ 2'
@a = (1, 2);
print \@a ~~ 2;
-e syntax OK

したがって、実際には参照の等価性をチェックしていますが、これはほとんどの場合 false である必要があります。;) ただし、配列の長さをチェックすることは、次のように行うことができるため、スマートマッチ演算子にとっては簡単すぎるかもしれません==:

$ perl -le '@a = (42, 17); print @a == 2'
1

何をテストしているのかが Perl プログラマーにとってより明白なので、私はこの方法を好みます。

スマート マッチは対称的ではないことに注意してください。順序を逆にすると、その配列に対して grep 検索が実行されます。

$ perl -nle '@a = (42, 17); print $_ ~~ @a ? "ok" : "no"'
1
no
2
no
17
ok
于 2012-10-30T10:01:41.830 に答える