在Edit distance: Ignore start/end中,我提出了一个模糊模糊匹配问题的Perl 6解决方案。我有这样的语法(尽管我可能在编辑#3之后对其进行了改进):
grammar NString {
regex n-chars { [<.ignore>* \w]**4 }
regex ignore { \s }
}
文字4
本身就是示例中目标字符串的长度。但下一个问题可能是另一个问题。那么我怎么能告诉语法我想要多长时间匹配呢?
答案 0 :(得分:4)
虽然文档没有显示示例或使用$args
参数,但我在S05-grammar/example.t in roast中找到了一个。
在:args
中指定参数并为正则表达式提供适当的签名。在正则表达式中,访问代码块中的参数:
grammar NString {
regex n-chars ($length) { [<.ignore>* \w]**{ $length } }
regex ignore { \s }
}
class NString::Actions {
method n-chars ($/) {
put "Found $/";
}
}
my $string = 'The quick, brown butterfly';
loop {
state $from = 0;
my $match = NString.subparse(
$string,
:rule('n-chars'),
:actions(NString::Actions),
:c($from++),
:args( \(5) )
);
last unless ?$match;
}
我仍然不确定传递参数的规则。这不起作用:
:args( 5 )
我明白了:
通过的位置太少;预计2个参数但得到1
这有效:
:args( 5, )
但是对于这一点的思考已经足够一夜了。