在Perl中禁用反向引用

6
我被告知在perl中禁用反向引用可以提高性能(前提是您不使用它们),如果您不使用任何反向引用,perl将自动执行此操作。
现在我有一个包含大量正则表达式的perl脚本,只有一个正则表达式使用了反向引用,我想知道以下内容:
  • 假设我有大量正则表达式(假设大部分处理时间都是正则表达式),禁用反向引用是否会显着提高性能?或者是否有标准可以用来判断这种情况?
  • 是否有一种方法可以在一开始禁用反向引用,并仅在需要时重新启用它(我知道有关(?:,但我不想将其添加到每个组中)?
  • 作用域是否允许perl为我优化这种反向引用行为(例如subeval是否改变perl关闭其外部引用的引用设置)?

1
假设我的大部分处理时间都用在正则表达式上了?真的吗?Profile 来证明或反驳你的假设。我敢打赌,你的程序一定很复杂,并且不会把大部分时间花费在正则表达式上。 - daxim
2个回答

15

使用捕获括号只会惩罚使用它们的正则表达式,所以只有在需要捕获时才使用它们,但是当你只需要分组时请使用非捕获括号 (?:...)

使用任何全局匹配变量

$` $& $'

如果可能的话,避免使用正则表达式,因为它会对所有的正则表达式都造成性能损失。(但一旦使用了,就愉快地使用吧!你已经付出了代价。)无法打开或关闭此功能。一旦Perl检测到其在任何地方被使用(即使是在您使用的第三方模块中),该功能就会被启用。

自Perl 5.10.0起,有一些针对全局匹配变量的替代方案,只会惩罚使用它们的正则表达式。如果您给特定的正则表达式添加/p修饰符,然后您可以使用...

${^PREMATCH} ${^MATCH} ${^POSTMATCH}

相反。


2
唯一真正的方法是自己进行性能分析。看看Benchmark模块(它在核心perl中,所以您不需要安装它)。设置几个基准测试:一个函数有十个正则表达式没有任何反向引用,另一个函数也有十个正则表达式但其中一个使用了反向引用。
如果您发现包含反向引用的正则表达式确实会使其余的正则表达式变慢,那么可以尝试重新编写该正则表达式,使其不包含反向引用。

因此,基准测试可以帮助我为这个特定的代码片段做出决策,但我希望获得一些信息,以便更轻松地做出未来的决策。总之,我不太了解禁用/启用反向引用的相关知识,并且正在努力获取更多信息,以便做出明智的决策。 - tzenes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接