我有
@a = (1,2,3); print (@a ~~ (1,2,3))
Run Code Online (Sandbox Code Playgroud)
和
@a = (1,2,3); print (@a == (1,2,3))
Run Code Online (Sandbox Code Playgroud)
第一个是我期望的工作,但它不会打印任何东西.第二个打印1.
为什么?是不是智能匹配运营商~~
应该匹配的情况@a ~~ (1,2,3)
?
ike*_*ami 12
一秒钟,让我们考虑一下略有不同
\@a ~~ (1,2,3)
Run Code Online (Sandbox Code Playgroud)
~~
在标量上下文中计算其参数,因此上面的内容与
scalar(\@a) ~~ scalar(1,2,3)
Run Code Online (Sandbox Code Playgroud)
\@a
(在任何上下文中)返回对引用的引用@a
.1, 2, 3
在标量上下文中类似于do { 1; 2; 3 }
,返回3
.所以减去几个警告*,上面相当于
\@a ~~ 3
Run Code Online (Sandbox Code Playgroud)
你真正想要的是什么
\@a ~~ do { my @temp = (1,2,3); \@temp }
Run Code Online (Sandbox Code Playgroud)
这可以缩短为
\@a ~~ [ 1,2,3 ]
Run Code Online (Sandbox Code Playgroud)
最后,~~
允许\@a
被写成的魔力@a
,这样可以进一步缩短
@a ~~ [ 1,2,3 ]
Run Code Online (Sandbox Code Playgroud)
* - 始终使用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
Run Code Online (Sandbox Code Playgroud)
从列表和数组有什么区别?在perlfaq.它专门向您展示您的价值选择是如何错误的.
您也可以首先写出您希望每个人工作或不工作的原因,以便我们可以纠正您的期望.为什么你认为你会得到你期望的结果?
至于智能匹配位,没有规则ARRAY ~~ LIST
.智能匹配仅适用于perlsyn中其表中枚举的对.它将迫使它成为其中一对.
当您遇到这些问题时,请尝试更多案例:
#!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 }
Run Code Online (Sandbox Code Playgroud)
各种情况的输出是你误读文档的线索:
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
Run Code Online (Sandbox Code Playgroud)