访问Perl 6中的部分匹配

时间:2017-10-31 08:32:56

标签: perl6

当我使用命名的正则表达式时,我可以打印其内容:

my regex rgx { \w\w };
my $string = 'abcd';

$string ~~ / <rgx> /;
say $<rgx>; # 「ab」

但如果我想与:g:ex副词匹配,那么不止一个匹配,它就不起作用。以下

my regex rgx { \w\w };
my $string = 'abcd';

$string ~~ m:g/ <rgx> /;
say $<rgx>; # incorrect

给出错误:

Type List does not support associative indexing.
  in block <unit> at test1.p6 line 5

我应该如何修改我的代码?

UPD :基于@ piojo&#39; s explanation,我修改了最后一行,如下所示,这解决了我的问题:

say $/[$_]<rgx> for ^$/.elems;

以下会更容易,但由于某些原因它不起作用:

say $_<verb> for $/; # incorrect

1 个答案:

答案 0 :(得分:5)

似乎:g:overlap是特殊情况:如果您的匹配在正则表达式中重复,例如/ <rgx>* /,那么您将以$<rgx>[0]的形式访问匹配项, $<rgx>[1]等等。但在这种情况下,引擎不止一次地进行整场比赛。因此,您可以通过顶级匹配运算符$/访问这些匹配项。事实上,$<foo>只是$/<foo>的快捷方式。

因此,根据错误消息,我们知道在这种情况下,$/是一个列表。因此,我们可以$/[0]<rgx>$/[1]<rgx>访问您的匹配。