regex - 在 perl 中禁用反向引用

标签 regex perl performance

有人告诉我,在 perl 中禁用反向引用可以提高性能(前提是您没有使用它们),并且如果您不使用任何反向引用,perl 将自行执行此操作。

现在我有一个包含大量正则表达式的 perl 脚本,只有一个使用反向引用,我想知道以下内容:

  • 鉴于我有大量的正则表达式(假设我的大部分处理时间都是正则表达式)禁用反向引用是否会显着提高性能?或者有什么标准我可以用来知道是否是这种情况?
  • 有没有一种方法可以在开始时禁用反向引用并仅在需要时重新启用它(我知道 (?: ,但我不想将它添加到每个分组中)?
  • 范围界定是否允许 perl 为我优化这种反向引用行为(即 subeval 是否会更改 perl 是否关闭对它之外的事物的反向引用)?
  • 最佳答案

    使用捕获括号只会惩罚使用它们的正则表达式,所以在需要捕获的地方使用它们,但使用非捕获括号(?:...)当您只需要分组时。

    使用任何全局匹配变量

    $` $& $'
    

    施加性能损失全部 正则表达式,所以尽可能避免使用它们。 (但是一旦你这样做了,就发疯了!你已经付出了代价。)没有办法打开和关闭它。一旦 Perl 检测到它们被用于任何地方(甚至在您可能使用的第三方模块中),该功能就会被打开。

    从 Perl 5.10.0 开始,全局匹配变量有一些替代方案,它们只惩罚使用它们的正则表达式。如果添加 /p修饰符到特定的正则表达式,然后您可以使用
    ${^PREMATCH} ${^MATCH} ${^POSTMATCH}
    

    反而。

    关于regex - 在 perl 中禁用反向引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3815525/

    相关文章:

    java - 如何在我的 Java 代码中使用 Nagios perl 脚本?

    c++ - "Isolate"来自 64 位数字的特定行/列/对角线

    java - 分配处理时通常有多少开销?

    database - 在 BerkeleyDB 中存储图像

    python - 与 pyTorch 相比,Jax/Flax(非常)慢的 RNN 前向传递?

    regex - 重复捕获组和懒惰问题

    r - 如何匹配字符串,直到某个模式在该模式未显示时也有效?

    javascript - 将字符串转换为正则表达式时如何保留\

    正则表达式匹配特定单词但不匹配特定组合

    perl - @ISA vs 使用 base vs 使用 parent