私は持っています
@a = (1,2,3); print (@a ~~ (1,2,3))
と
@a = (1,2,3); print (@a == (1,2,3))
最初のものは私が動作することを期待しているものですが、何も印刷されません。2つ目は1を出力します。
なんで?スマートマッチング演算子~~
は、の場合に一致することになっているのではあり@a ~~ (1,2,3)
ませんか?
私は持っています
@a = (1,2,3); print (@a ~~ (1,2,3))
と
@a = (1,2,3); print (@a == (1,2,3))
最初のものは私が動作することを期待しているものですが、何も印刷されません。2つ目は1を出力します。
なんで?スマートマッチング演算子~~
は、の場合に一致することになっているのではあり@a ~~ (1,2,3)
ませんか?
少し違うことを考えてみましょう
\@a ~~ (1,2,3)
~~
スカラーコンテキストで引数を評価するため、上記は次のようになります。
scalar(\@a) ~~ scalar(1,2,3)
\@a
(任意のコンテキストで)への参照を返します@a
。1, 2, 3
スカラーコンテキストでは、に似ておりdo { 1; 2; 3 }
、を返し3
ます。したがって、いくつかの警告*を差し引いた場合、上記は次のようになります。
\@a ~~ 3
あなたが実際に欲しいのは
\@a ~~ do { my @temp = (1,2,3); \@temp }
に短縮することができます
\@a ~~ [ 1,2,3 ]
最後に、の魔法は、として書くことが~~
できるので、さらに短縮することができます\@a
@a
@a ~~ [ 1,2,3 ]
* —常に使用してuse strict; use warnings;
ください!
スマートマッチは、右側で配列または配列参照を使用する場合に期待していることを実行しようとしますが、リストは使用しません。
$ perl -E '@a = (1, 2, 3); say (@a ~~ (1, 2, 3))'
$ perl -E '@a = (1, 2, 3); say ((1, 2, 3) ~~ @a)' # also misguided, but different
1
$ perl -E '@a = (1, 2, 3); say (@a ~~ [1, 2, 3])'
1
リストと配列の違いは何ですか?perlfaqで。具体的には、値の選択がどのように間違っているかを示します。
また、それぞれが機能することを期待した理由と機能しないことを期待した理由を書き出すことから始めて、期待を修正することもできます。なぜあなたはあなたが期待した結果を得るだろうと思いましたか?
スマートマッチビットに関しては、のルールはありませんARRAY ~~ LIST
。スマートマッチは、perlsynのテーブルに列挙されているペアでのみ機能します。それはそれをそれらのペアの1つにすることを強制するでしょう。
これらの問題が発生した場合は、さらに多くのケースを試してください。
#!perl
use v5.10.1;
use strict;
use warnings;
my @a = (1,2,3);
say "\@a is @a";
say "\@a ~~ (1,2,3) is ", try( @a ~~ (1,2,3) );
say "\@a ~~ [1,2,3] is ", try( @a ~~ [1,2,3] );
say "\@a ~~ 3 is ", try( @a ~~ 3 );
say "3 ~~ \@a is ", try( 3 ~~ @a );
say '';
my @b = (4,5,6);
say "\@b is @b";
say "\@b ~~ (4,5,6) is ", try( @b ~~ (4,5,6) );
say "\@b ~~ [4,5,6] is ", try( @b ~~ [4,5,6] );
say "\@b ~~ 3 is ", try( @b ~~ 3 );
say "3 ~~ \@b is ", try( 3 ~~ @b );
say '';
say "\@b ~~ \@a is ", try( @b ~~ @a );
sub try { $_[0] || 0 }
さまざまなケースの出力は、ドキュメントを読み間違えた手がかりです。
Useless use of a constant (2) in void context at test.pl line 8.
Useless use of a constant (4) in void context at test.pl line 17.
Useless use of a constant (5) in void context at test.pl line 17.
@a is 1 2 3
@a ~~ (1,2,3) is 0
@a ~~ [1,2,3] is 1
@a ~~ 3 is 0
3 ~~ @a is 1
@b is 4 5 6
@b ~~ (4,5,6) is 0
@b ~~ [4,5,6] is 1
@b ~~ 3 is 0
3 ~~ @b is 0
@b ~~ @a is 0