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

Gre*_*bet 5 regex perl pcre re2

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

我已经看到一些模块用于在给定的PCRE(re :: engine :: PCRE),TRE(re :: engine :: TRE)或RE2(re :: engine :: RE2)中替换Perl正则表达式引擎词汇语境.我找不到任何面向对象的模块来创建/编译使用不同后端的正则表达式.我很好奇为什么有人会选择将此功能作为一个pragma而不是一个更典型的模块来实现.看起来替换perl正则表达式引擎会比制作暴露PCRE,TRE和RE2已经提供的API的XS脚本要困难得多(取决于它暴露的API的复杂性).

Thi*_*Not 5

我很好奇...为什么我看到的模块是编译指示而不是更传统的OO /程序界面.

可能是因为perldoc perlreapi自5.9.5开始记录并可用的Perl正则表达式API,您可以利用Perl的解析器,它可以为您提供很多代码很少的很酷的功能.

如果您使用API​​,您:

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

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

备择方案

如果您只是想要一种更简单的方法来实现自己的正则表达式引擎,请查看re::engine::Plugin,这样您就可以在Perl而不是C/XS中编写实现.请注意,有一长串警告,包括不支持splits///.

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