在 Perl 6 中访问部分匹配项
Accessing parts of match in Perl 6
当我使用命名的正则表达式时,我可以打印它的内容:
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 的 ,我修改了最后一行,解决了我的问题:
say $/[$_]<rgx> for ^$/.elems;
以下会更容易,但由于某些原因它不起作用:
say $_<verb> for $/; # incorrect
似乎 :g
和 :overlap
是特殊情况:如果您的匹配项在正则表达式中重复出现,例如 / <rgx>* /
,那么您将以 $<rgx>[0]
的形式访问匹配项], $<rgx>[1]
, 等等。但在这种情况下,引擎不止一次地进行整个匹配。因此,您可以通过顶级匹配运算符 $/
访问这些匹配项。实际上,$<foo>
只是$/<foo>
的一个快捷方式。
所以根据报错信息,我们知道在本例中,$/
是一个列表。因此我们可以访问您的匹配项 $/[0]<rgx>
和 $/[1]<rgx>
.
当我使用命名的正则表达式时,我可以打印它的内容:
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 的
say $/[$_]<rgx> for ^$/.elems;
以下会更容易,但由于某些原因它不起作用:
say $_<verb> for $/; # incorrect
似乎 :g
和 :overlap
是特殊情况:如果您的匹配项在正则表达式中重复出现,例如 / <rgx>* /
,那么您将以 $<rgx>[0]
的形式访问匹配项], $<rgx>[1]
, 等等。但在这种情况下,引擎不止一次地进行整个匹配。因此,您可以通过顶级匹配运算符 $/
访问这些匹配项。实际上,$<foo>
只是$/<foo>
的一个快捷方式。
所以根据报错信息,我们知道在本例中,$/
是一个列表。因此我们可以访问您的匹配项 $/[0]<rgx>
和 $/[1]<rgx>
.