我一直试图弄清楚如何在Perl 6中做一个递归的正则表达式。对于一个玩具示例,一个平衡的括号匹配器,它将匹配((())())
中的(((((())())
。
我以为这样做会:
my regex paren {
'(' ~ ')' <paren>*
}
或者更简单
my regex paren {
'(' <paren>* ')'
}
但那失败了
No such method 'paren' for invocant of type 'Match'
in regex paren at ...
你需要明确表示你正在调用my
-scoped正则表达式:
my regex paren {
'(' ~ ')' <&paren>*
}
注意已添加的&
。接着就,随即:
say "(()())" ~~ /^<&paren>$/ # 「(()())」
say "(()()" ~~ /^<&paren>$/ # Nil
虽然你有时可以明确地写出&
,但确实可以在使用它时:
say "(()())" ~~ /^<paren>$/ # 「(()())」
say "(()()" ~~ /^<paren>$/ # Nil
这只能起作用,因为编译器发现在词法范围内定义了一个名为paren
的正则表达式,因此将<paren>
语法编译为该语法。对于递归情况,声明在解析正则表达式之前不会安装,因此需要显式。