使用 perl 的 Regexp::Grammars,如何进行依赖于 $MATCH 的捕获?
我有一个这样的令牌:
<delim2=((?{ $MATCH{delim} }))>
我想要发生的是 delim2 捕获并设置为 delim 的值。当我运行此命令时,设置了 delim2,但捕获从未完成。我认为这是我的推理中的错误:我试图将这种形式:
<ALIAS= ( PATTERN )> Match pattern, save match in $MATCH{ALIAS}
和这种形式: (?{ MATCH{delim} })
链接到类似的东西,
<ALIAS= ( (?{MATCH{delim}) )> Matches the value of $MATCH{delim} save to $MATCH{delim2}
但这似乎并不有效的。我可以验证我的原始令牌是否有效
会随着该值而消失,并且,如果我对它进行硬编码,我会得到正确捕获并且一切正常
?那么,我如何在拥有动态模式的同时获得合理的结果呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
(?{ $MATCH{delim} })
不会断言$MATCH{delim}
出现在输入中;只是它是一个真正的价值。 Regexp::Grammars 应该有一个像 perl\k
这样的“命名反向引用”结构,但它没有(并且你不能使用\k
> 因为 Regexp::Grammars 将其结果存储在完全不同的地方)。你可以做一些类似的事情
,虽然很可怕,但在测试中似乎有效。或者你可以放弃并转到 Parse::RecDescent ,它对此类事情有更好的支持。或者你可以开始破解 R::G。
(?{ $MATCH{delim} })
doesn't assert that$MATCH{delim}
appears here in the input; only that it's a true value. Regexp::Grammars should have a "named-backreference" construct like perl\k<NAME>
but it doesn't (and you can't use\k<NAME>
because Regexp::Grammars stores its results somewhere entirely different).You could do something like
which is horrible but seems to work in testing. Or you could give in and go to Parse::RecDescent which has better support for this kind of thing. Or you could start hacking on R::G.