这是Perl智能匹配的预期行为吗?

时间:2013-09-06 18:34:21

标签: regex perl

### 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

这些都不应该通过吗?

2 个答案:

答案 0 :(得分:5)

Smartmatch的行为通常取决于 right 操作数的类型;它不对称。保持阵列在右侧,你应该看到你期望的行为。

来自perlop

  

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

再次阅读这篇文章,说实话,这种行为似乎有点奇怪和不可预测,而且我将它的使用限制在记录良好的帮助函数或极其微不足道的情况下。

答案 1 :(得分:2)

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

我们可以查看table of possible type combinations以确定选择哪种情况。

  • @a ~~ /^1$/的类型为ARRAY ~~ Regexp,其描述为“任何ARRAY元素与Regexp匹配。喜欢:grep { /Regexp/ } ARRAY“。

  • '1' ~~ @a的类型为Any ~~ ARRAY,其描述为“smartmatch each ARRAY element”。喜欢:grep { Any ~~ $_ } ARRAY“。第二级智能匹配应使用Any ~~ NumAny ~~ Any个案例。

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

  • @a ~~ /^Ah$/再次是上述正则表达式。

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