我有一个这样的代币:
<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=(')>
?那么如何在拥有动态模式的同时实现理智的结果呢?
答案 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。