为什么@array ~~ LIST返回false,即使@array包含与LIST相同的元素?

时间:2012-02-24 20:19:34

标签: perl smartmatch

我有

@a = (1,2,3); print (@a ~~ (1,2,3))

@a = (1,2,3); print (@a == (1,2,3))

第一个是我希望工作的那个,但它不会打印任何东西。第二个打印1。

为什么呢?在~~

的情况下,智能匹配运算符@a ~~ (1,2,3)是否应匹配?

3 个答案:

答案 0 :(得分:12)

暂时,我们可以考虑稍微不同的

\@a ~~ (1,2,3)

~~在标量上下文中评估其参数,因此上述内容与

相同
scalar(\@a) ~~ scalar(1,2,3)
  • \@a(在任何上下文中)都会返回对@a
  • 的引用 标量上下文中的
  • 1, 2, 3do { 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;

答案 1 :(得分:9)

如果您在右侧使用数组或数组引用,智能匹配尝试执行我认为您期望的操作 - 但不是列表。

$ 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

答案 2 :(得分:6)

从perlfaq中的What is the difference between a list and an array?开始。它专门向您展示了您的价值选择是如何错误的。

您也可以首先写出您希望每个人工作或不工作的原因,以便我们可以纠正您的期望。为什么你认为你会得到你期望的结果?

对于智能匹配位,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 }

各种案例的输出是您误读文档的线索:

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