perl6 语法做替换
perl6 grammar to do substitution
好的,我正在学习 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;
那么,我在这里做错了什么?谢谢
<mon>
的范围是捕获组,而不是 TOP
规则。您可以通过索引匹配对象来获取它,但使用非捕获组可能更容易:
regex TOP { [\s* <mon> \s*]+ }
此外,由于 +
量词,您将不会获得单个匹配对象,而是一个列表。您可以使用 >>
或 map
来获取有效载荷,例如
method TOP ($/) { make $<mon>>>.made }
好的,我正在学习 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;
那么,我在这里做错了什么?谢谢
<mon>
的范围是捕获组,而不是 TOP
规则。您可以通过索引匹配对象来获取它,但使用非捕获组可能更容易:
regex TOP { [\s* <mon> \s*]+ }
此外,由于 +
量词,您将不会获得单个匹配对象,而是一个列表。您可以使用 >>
或 map
来获取有效载荷,例如
method TOP ($/) { make $<mon>>>.made }