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