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」
>
答案 0 :(得分:2)
导致这些不同产出的规则是:
m/ /
与正则表达式匹配一次,如果成功则返回Match
个对象,如果没有,则返回Nil
。m:g/ /
会在匹配时重复匹配正则表达式,并返回零{或1}个List
个Match
个对象。( )
会导致一个位置捕获,它本身就是一个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」