为什么要将不同的正则表达式引擎(例如PCRE)实现为pragma?

前端之家收集整理的这篇文章主要介绍了为什么要将不同的正则表达式引擎(例如PCRE)实现为pragma?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我很好奇使用不同的正则表达式引擎取代默认的Perl的最佳实践,以及为什么我看到的模块是编译指示而不是更传统的OO /程序界面.我想知道为什么会这样.

我已经看到一些模块用于在给定的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所述.这仅适用于常量正则表达式;你必须在将变量插入到正则表达式之前显式转换变量.

猜你在找的正则表达式相关文章