3

Programming Perlによると、左側に「any」、右側に数値を指定してスマートマッチを使用すると、数値の等価性がチェックされます。

------------------------------------------------------------------------------
| Left | Right |    Description    | Like (But Evaluated in Boolean Context) |
------------------------------------------------------------------------------
|  Any |   Num |  Numeric equality |               Any == Num                |

したがって、次の出力が期待されます1

my @arr = ('aaa');
my $num = 1;
say @arr ~~ $num;

しかし、実際には空の文字列を出力します。

要素が1つなので@arrスカラーに変換されると思っていたので、と同等です。1say @arr ~~ $numsay @arr == $num

@arr ~~ $numが と異なるのはなぜ@arr == $numですか?

4

2 に答える 2

3

smartmatch 演算子は明らかにリストをオペランドとして取りません。そのため、オペランドはスカラー コンテキストで評価されます。それが話の終わりだった場合、次は機能しません

my @a = ('aaa', 'bbb');
my $s = 'aaa';
say $s ~~ @a;

と同じになるからです。

say 'aaa' ~~ 2;

しかし、それが機能することは明らかです。これは、最初のオペランドに対する参照と同様に、スマートマッチが配列またはハッシュであるオペランドへの参照を自動的に作成するためですpush。つまり

say $s ~~ @a;

本当に

say $s ~~ \@a;

そして(あなたのコード)

say @a ~~ $n;

と同じです

say \@a == $n;

長さを明示的に取得する必要があります。以下はあなたが望むことをします:

say 0+@a ~~ $n;

もちろん、そうなるだろう

say 0+@a == $n;

あるいは

say @a == $n;
于 2012-07-28T14:47:14.937 に答える
2

これは、スマートマッチが最初に参照を取るためです。@array ~~ $numに相当しますが\@array == $num、これは明らかに真である可能性が非常に低いです。

私のSmart::Matchモジュールと do@array ~~ array_length($num)を使いたいと思うかもしれません@array ~~ contains($num)

于 2012-07-28T11:41:18.523 に答える