加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:59:57 所属栏目:百科 来源:网络整理
导读:我很好奇使用不同的正则表达式引擎取代默认的Perl的最佳实践,以及为什么我看到的模块是编译指示而不是更传统的OO /程序界面.我想知道为什么会这样. 我已经看到一些模块用于在给定的PCRE(re :: engine :: PCRE),TRE(re :: engine :: TRE)或RE2(re :: engine :
我很好奇使用不同的正则表达式引擎取代默认的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所述.这仅适用于常量正则表达式;你必须在将变量插入到正则表达式之前显式转换变量.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读