为什么要实现不同的正则表达式引擎(例如 PCRE)作为编译指示?
Why implement a different regex engine (e.g. PCRE) as a pragma?
我很好奇使用不同的正则表达式引擎代替默认的 Perl 引擎的最佳实践,以及为什么我看到的模块是编译指示而不是更传统的 OO/procedural 界面。我想知道为什么会这样。
我见过一些用 PCRE (re::engine::PCRE)、TRE (re::engine::TRE) 或 RE2 (re::engine:: RE2) 在给定的词汇上下文中。我找不到任何使用不同后端的 creating/compiling 正则表达式的面向对象模块。我很好奇为什么有人会选择将此功能作为编译指示而不是作为更典型的模块来实现。似乎替换 perl 正则表达式引擎会比制作一个公开 PCRE、TRE 和 RE2 已经提供的 API 的 XS 脚本要困难得多(取决于它公开的 API 的复杂性) .
I'm curious about...why the modules I've seen are pragmas and not a more traditional OO/procedural interface.
可能是因为 Perl 正则表达式 API,记录在 perldoc perlreapi
中并且从 5.9.5 开始可用,它可以让您利用 Perl 的解析器,它可以用很少的代码提供很多很酷的功能。
如果您使用 API,您:
- 不必实现您自己的
split
版本和替换运算符 s///
- 不必编写自己的代码来解析正则表达式修饰符(
msixpn
作为标志传递给您实现的回调函数)
- 可以利用优化,例如仅编译一次(在编译时)常量正则表达式和仅在变量更改时编译包含插值变量的正则表达式
- 可以在您的程序中使用
qr
来引用正则表达式并轻松地将它们插入到其他正则表达式中
- 可以轻松设置编号和命名的捕获变量,例如
</code>、<code>$+{foo}
- 不要强迫您引擎的用户重写他们所有的代码来使用您的API;他们可以简单地添加一个 pragma
我可能错过了更多。关键是,您可以通过 API 获得大量免费代码和免费功能。例如,如果您查看 re::engine::PCRE
的实现,它实际上相当短(< 400 行 XS 代码)。
备选方案
如果您只是想寻找一种更简单的方法来实现您自己的正则表达式引擎,请查看 re::engine::Plugin
, which lets you write your implementation in Perl instead of C/XS. Do note that there is a long list of caveats,包括不支持 split
和 s///
。
或者,您可以使用 perldoc perlre
中所述的重载常量来扩展内置引擎,而不是实现完全自定义的引擎。这只适用于常量正则表达式;在将变量插入正则表达式之前,您必须显式转换变量。
我很好奇使用不同的正则表达式引擎代替默认的 Perl 引擎的最佳实践,以及为什么我看到的模块是编译指示而不是更传统的 OO/procedural 界面。我想知道为什么会这样。
我见过一些用 PCRE (re::engine::PCRE)、TRE (re::engine::TRE) 或 RE2 (re::engine:: RE2) 在给定的词汇上下文中。我找不到任何使用不同后端的 creating/compiling 正则表达式的面向对象模块。我很好奇为什么有人会选择将此功能作为编译指示而不是作为更典型的模块来实现。似乎替换 perl 正则表达式引擎会比制作一个公开 PCRE、TRE 和 RE2 已经提供的 API 的 XS 脚本要困难得多(取决于它公开的 API 的复杂性) .
I'm curious about...why the modules I've seen are pragmas and not a more traditional OO/procedural interface.
可能是因为 Perl 正则表达式 API,记录在 perldoc perlreapi
中并且从 5.9.5 开始可用,它可以让您利用 Perl 的解析器,它可以用很少的代码提供很多很酷的功能。
如果您使用 API,您:
- 不必实现您自己的
split
版本和替换运算符s///
- 不必编写自己的代码来解析正则表达式修饰符(
msixpn
作为标志传递给您实现的回调函数) - 可以利用优化,例如仅编译一次(在编译时)常量正则表达式和仅在变量更改时编译包含插值变量的正则表达式
- 可以在您的程序中使用
qr
来引用正则表达式并轻松地将它们插入到其他正则表达式中 - 可以轻松设置编号和命名的捕获变量,例如
</code>、<code>$+{foo}
- 不要强迫您引擎的用户重写他们所有的代码来使用您的API;他们可以简单地添加一个 pragma
我可能错过了更多。关键是,您可以通过 API 获得大量免费代码和免费功能。例如,如果您查看 re::engine::PCRE
的实现,它实际上相当短(< 400 行 XS 代码)。
备选方案
如果您只是想寻找一种更简单的方法来实现您自己的正则表达式引擎,请查看 re::engine::Plugin
, which lets you write your implementation in Perl instead of C/XS. Do note that there is a long list of caveats,包括不支持 split
和 s///
。
或者,您可以使用 perldoc perlre
中所述的重载常量来扩展内置引擎,而不是实现完全自定义的引擎。这只适用于常量正则表达式;在将变量插入正则表达式之前,您必须显式转换变量。