我应该如何处理标有“警告”的正则表达式功能,如“(?{code})”,“(?? {code})”或“特殊回溯控制动词”?我应该多严肃地接受警告?
答案 0 :(得分:4)
我认为他们会在这里停留,不管怎么说 - 尤其是代码逃脱。十多年来,代码逃脱一直伴随着我们。
use re "eval"
照顾他们的可怕 - 他们可以用不可预见的方式调用代码。此外,正在使用正则表达式匹配器直到5.12 IIRC,这可能会限制它们的用途。
string-eval版本(??{ code })
曾经是进行递归的唯一方法,但从5.10起我们有更好的方法来做到这一点;对速度差异进行基准测试表明,在大多数情况下,评估方式会慢一些。
我主要使用block-eval版本(?{ code})
来添加调试,这种调试发生在与use re "debug"
不同的粒度上。曾经模糊地打扰我,块eval版本的返回值不可用,直到我意识到是。你只需要将它用作条件模式的测试部分,就像测试一个数字是否由数字组成的模式一样,每个位置向右减少一个数字:
qr{
^ (
( \p{Decimal_Number} )
(?(?= ( \d )) | $)
(?(?{ ord $3 == 1 + ord $2 }) (?1) | $)
) $
}x
在我弄清条件之前,我会这样写:
qr{
^ (
( \p{Decimal_Number} )
(?= $ | (??{ chr(1+ord($2)) }) )
(?: (?1) | $ )
) $
}x
效率低得多。
回溯控制动词更新。我主要使用它们来获取匹配的所有可能排列,并且只需要(*FAIL)
。我相信这是(*ACCEPT)
特征,特别标记为“高度实验性”。自5.10以来,这些只与我们同在。