我已经看到一些模块用于在给定的PCRE(re :: engine :: PCRE),TRE(re :: engine :: TRE)或RE2(re :: engine :: RE2)中替换Perl正则表达式引擎词汇语境.我找不到任何面向对象的模块来创建/编译使用不同后端的正则表达式.我很好奇为什么有人会选择将此功能作为一个pragma而不是一个更典型的模块来实现.看起来替换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.
可能是因为在perldoc perlreapi
中记录并且从5.9.5开始提供的Perl正则表达式API可以让您利用Perl的解析器,它为您提供了很多代码很少的很酷的功能.
如果您使用API,您:
>不必实现自己的split版本和替换运算符///
>不必编写自己的代码来解析正则表达式修饰符(msixpn作为标志传递给实现的回调函数)
>可以利用优化,例如只编译一次的常规正则表达式(在编译时)和包含仅在变量更改时编译的插值变量的正则表达式
>可以在程序中使用qr来引用正则表达式,并轻松地将它们插入到其他正则表达式中
>可以轻松设置编号和命名的捕获变量,例如$1,${foo}
>不要强迫引擎用户重写所有代码以使用您的API;他们可以简单地添加一个pragma
我可能错过了更多.关键是,您可以通过API获得大量免费代码和免费功能.例如,如果你看一下re::engine::PCRE
的实现,它实际上相当短(<400行的XS代码). 备择方案 如果您只是想要一种更简单的方法来实现自己的正则表达式引擎,请查看re::engine::Plugin
,它允许您使用Perl而不是C / XS编写实现.请注意,有一个很长的caveats列表,包括不支持split和s ///.
或者,您可以使用重载常量扩展内置引擎,而不是实现完全自定义引擎,如perldoc perlre
所述.这仅适用于常量正则表达式;你必须在将变量插入到正则表达式之前显式转换变量.