5

我很好奇使用不同的正则表达式引擎代替默认 Perl 引擎的最佳实践,以及为什么我看到的模块是编译指示而不是更传统的 OO/过程接口。我想知道为什么会这样。

我见过一些模块在给定的情况下用 PCRE (re::engine::PCRE)、TRE (re::engine::TRE) 或 RE2 (re::engine::RE2) 替换 Perl 正则表达式引擎词汇上下文。我找不到任何面向对象的模块来创建/编译使用不同后端的正则表达式。我很好奇为什么有人会选择将这个功能作为一个编译指示而不是一个更典型的模块来实现。似乎替换 perl 正则表达式引擎(取决于它公开的 API 的复杂性)比制作一个公开 PCRE、TRE 和 RE2 已经提供的 API 的 XS 脚本要困难得多。

4

1 回答 1

5

我很好奇......为什么我看到的模块是编译指示而不是更传统的 OO/过程接口。

可能是因为 Perl 正则表达式 API(在perldoc perlreapi5.9.5 中记录并可用)让您可以利用 Perl 的解析器,它以很少的代码为您提供了许多很酷的功能。

如果您使用 API,您:

  • 不必实现您自己的版本split和替换运算符s///
  • 不必编写自己的代码来解析正则表达式修饰符(msixpn作为标志传递给实现的回调函数)
  • 可以利用优化,例如常量正则表达式仅编译一次(在编译时)和包含插值变量的正则表达式仅在变量更改时编译
  • 可以qr在您的程序中使用来引用正则表达式并轻松地将它们插入到其他正则表达式中
  • 可以轻松设置编号和命名的捕获变量,例如$1$+{foo}
  • 不要强迫您的引擎用户重写所有代码以使用您的 API;他们可以简单地添加一个编译指示

可能还有更多我错过了。关键是,您可以通过 API 获得大量免费代码和免费功能。例如,如果您查看 的实现re::engine::PCRE,它实际上相当短(< 400 行 XS 代码)。

备择方案

如果您只是在寻找一种更简单的方法来实现您自己的正则表达式引擎,请查看re::engine::Plugin,它可以让您用 Perl 而不是 C/XS 来编写您的实现。请注意,有一长串警告,包括不支持splitand s///

或者,您可以通过使用重载常量来扩展内置引擎,而不是实现完全自定义的引擎,如perldoc perlre. 这仅适用于常量正则表达式;您必须在将变量插入正则表达式之前显式转换它们。

于 2015-07-26T16:32:51.873 回答