perl6语法做替换

时间:2016-11-24 10:29:23

标签: regex action perl6 proto

好的,我正在学习perl6,我正在尝试做一些非常简单的事情:根据动作对象使用语法来改变匹配的文本。但我失败了,我不知道为什么。请原谅我这么简单的问题。我不在技术或编程行业。所以,请耐心等待我,好吗?

我想将“jan”改为01,将“feb”改为02;这么简单:

grammar month {
    regex TOP { (\s* <mon> \s*)+ }
    proto regex mon {*}
    regex mon:sym<jan> { <sym> }
    regex mon:sym<feb> { <sym> }
}
class monAct {
    method TOP ($/) {
    make $<mon>.made;
    }
    method mon:sym<jan> ($/) { make "01"; };
    method mon:sym<feb> ($/) { make "02"; };
}
my $m = month.parse("jan feb jan feb", actions => monAct.new);
say $m.made; # it says Nil instead of "01 02 01 02" that I want; 

那么,我在这里做错了什么?感谢。

1 个答案:

答案 0 :(得分:3)

<mon>的范围限定为捕获组,而不是TOP规则。您可以索引到匹配对象以获取它,但它可能更容易使用非捕获组:

regex TOP { [\s* <mon> \s*]+ }

此外,由于+量词,您不会获得单个匹配对象,而是列表。您可以使用>>map来获取有效负载,例如

method TOP ($/) { make $<mon>>>.made }