2
### Code Here ###

use 5.012;
use warnings;
my @a = (1, 'Ah');

say (@a ~~ /^1$/ ? 'TRUE' : 'FALSE');
say ('1' ~~ @a ? 'TRUE' : 'FALSE');
say (@a ~~ "Ah" ? 'TRUE' : 'FALSE');
say (@a ~~ /^Ah$/ ? 'TRUE' : 'FALSE');

### STDOUT ###

TRUE
TRUE
FALSE
TRUE

难道这些都不应该通过吗?

4

2 回答 2

5

Smartmatch 的行为一般由操作数的类型决定;它不是对称的。将数组保持在右侧,您应该会看到预期的行为。

perlop

通常最好将其朗读为“in”、“inside of”或“is contains in”,因为左操作数通常在右操作数内部查找。这使得 smartmatch 操作数的操作数的顺序通常与常规匹配运算符的顺序相反。换句话说,“较小”的东西通常放在左边的操作数中,较大的放在右边的操作数中。

再读一遍,老实说,这种行为似乎有点奇怪和不可预测,我会将它的使用限制在有据可查的辅助函数或极其微不足道的情况下。

于 2013-09-06T18:50:29.187 回答
2

Smartmatch 是一个微妙的野兽,Perl5 的实现可以说是有缺陷的——它在 5.18 版本中被降级为实验状态。

我们可以查看可能的类型组合表来确定选择哪种情况。

  • 具有描述“任何 ARRAY 元素与正则表达式匹配”的@a ~~ /^1$/has 类型。ARRAY ~~ Regexp比如:grep { /Regexp/ } ARRAY”。

  • '1' ~~ @ahas 类型,其Any ~~ ARRAY描述为“智能匹配每个 ARRAY 元素。比如:grep { Any ~~ $_ } ARRAY”。第二级智能匹配应该使用Any ~~ NumandAny ~~ Any情况。

  • @a ~~ "Ah"可能有 type Any ~~ Any,它进行字符串比较!

  • 又是上面的@a ~~ /^Ah$/正则表达式案例。

通过查看正确的参数可以最好地理解 smartmatch 表。如果是集合,则 smartmatch 是in运算符。如果它是正则表达式或 coderef,则 smartmatch 的行为类似于应用程序。如果它是一个简单的标量,则进行普通比较(或==eq)。

于 2013-09-06T19:04:16.490 回答