perl6 (pattern)* 和 m:global/(pattern)/ 返回的列表有何不同?

perl6 How do lists returned by (pattern)* and m:global/(pattern)/ differ?

Perl6 returns 使用 (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」
> 

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

  • m/ / 匹配正则表达式一次,如果成功则 returns 一个 Match 对象,否则 Nil
  • m:g/ / 重复匹配正则表达式的次数与它匹配的次数一样多,并且 returns 零个或多个 Match 个对象的 List
  • ( ) 在正则表达式中导致一个位置捕获,它本身就是一个 Match 对象。
  • 正则表达式中的
  • ( )* 会导致一个位置捕获,即 List 零个或多个 Match 个对象。
  • 正则表达式中的
  • ( )+ 导致一次位置捕获,这是一个或多个 Match 对象的 List
  • 可以在父 Match 对象上使用 .[ ][=28=]</code>、<code>...[=70 进行位置捕获=]

所以在你的例子中:

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


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


  • m:g/ (an) / Returns 七个 「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」