使用perl的Regexp :: Grammars,如何根据$ MATCH进行捕获?

时间:2010-06-15 19:37:15

标签: perl regexp-grammars

我有一个这样的代币:

<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}

但这似乎没有效果。我可以验证我的原始令牌作品<delim2=((?{ die $MATCH{delim} }))>是否会死于该值,如果我对其进行硬编码,我会获得正确的捕获并且一切正常<delim2=(')>?那么如何在拥有动态模式的同时实现理智的结果呢?

1 个答案:

答案 0 :(得分:4)

(?{ $MATCH{delim} })没有声明输入中出现$MATCH{delim};只是它是一个真正的价值。 Regexp :: Grammars应该有一个像perl \k<NAME>这样的“named-backreference”结构,但它没有(并且你不能使用\k<NAME>,因为Regexp :: Grammars将它的结果存储在完全不同的地方)。

您可以执行类似

的操作
(??{ quotemeta $MATCH{delim} })<delim2=(?{ $MATCH{delim} })>

这很可怕,但似乎在测试中起作用。或者你可以放弃并转到Parse :: RecDescent,它可以更好地支持这种事情。或者你可以开始攻击R :: G。