perl6(模式)*和m:global /(pattern)/返回的列表如何?

时间:2017-03-07 07:38:43

标签: list match global perl6

Perl6在使用(pattern)*或(pattern)+进行捕获时会返回一个列表,并且我会在以下情况下成像:在使用g副词时会发生类似的事情。但是,使用这两种方法返回的列表并不相同。这些文件没有提供更多细节。有没有其他来源可以找到更多信息?

以下是一个例子:

To exit type 'exit' or '^D'
> my $a = "bananananananana";
bananananananana
> my $m = ($a ~~ m/ (an)+ /)
「ananananananan」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
> say $m[0]
[「an」 「an」 「an」 「an」 「an」 「an」 「an」]
> say $m[0][0]
「an」
> say $m[0][2]
「an」
> my $m = ($a ~~ m:g/ (an)+ /)
(「ananananananan」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」)
> say $m[0];
「ananananananan」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
 0 => 「an」
> say $m[0][1]
Nil
> say $m[0][0]
[「an」 「an」 「an」 「an」 「an」 「an」 「an」]
> say $m[0][0][1]
「an」
> my $n = ($a ~~ m:g/ (an) /)
(「an」
 0 => 「an」 「an」
 0 => 「an」 「an」
 0 => 「an」 「an」
 0 => 「an」 「an」
 0 => 「an」 「an」
 0 => 「an」 「an」
 0 => 「an」)
> say $n[0]
「an」
 0 => 「an」
> say $n[0][0]
「an」
> 

1 个答案:

答案 0 :(得分:2)

导致这些不同产出的规则是:

  • m/ /与正则表达式匹配一次,如果成功则返回Match个对象,如果没有,则返回Nil
  • m:g/ /会在匹配时重复匹配正则表达式,并返回零{或1}个ListMatch个对象。
  • 正则表达式中的
  • ( )会导致一个位置捕获,它本身就是一个Match对象。
  • 正则表达式中的
  • ( )*会导致一次位置捕获,即List零个或多个Match个对象。
  • 正则表达式中的
  • ( )+会导致一次位置捕获,这是一个或多个List个对象的Match
  • 可以使用父.[ ]个对象上的Match$0$1$2 ...
  • 获取位置捕获

所以在你的例子中:

  • m/ (an)+ /返回匹配「ananananananan」,其中有一个位置捕获,它是七个「an」匹配的列表。

  • m:g/ an /返回七个「an」个匹配的列表,没有任何捕获。

  • m:g/ (an) /返回七个「an」个匹配项的列表,每个匹配项都有一个「an」匹配的位置捕获。

我认为您的混淆可能是由say打印列表和匹配摘要的方式引起的 对于最后一个示例,特别是say将结果打印为:

(「an」
 0 => 「an」 「an」
 0 => 「an」 「an」
 0 => 「an」 「an」
 0 => 「an」 「an」
 0 => 「an」 「an」
 0 => 「an」 「an」
 0 => 「an」)

...实际上是七个Match个对象的列表,每个对象都是

「an」
 0 => 「an」