Зачем реализовывать другой движок регулярных выражений (например, PCRE) в качестве прагмы?

Мне любопытны лучшие практики использования другого механизма регулярных выражений вместо стандартного Perl и почему модули, которые я видел, являются прагмами, а не более традиционным объектно-ориентированным/процедурным интерфейсом. Мне было интересно, почему это так.

Я видел несколько модулей для замены механизма регулярных выражений Perl на PCRE (re::engine::PCRE), TRE (re::engine::TRE) или RE2 (re::engine::RE2) в данном лексический контекст. Я не могу найти какие-либо объектно-ориентированные модули для создания/компиляции регулярных выражений, которые используют другой сервер. Мне любопытно, почему кто-то решил реализовать эту функциональность как прагму, а не как более типичный модуль. Кажется, что заменить механизм регулярных выражений perl будет намного сложнее (в зависимости от сложности API, который он предоставляет), чем создать сценарий XS, который предоставляет API, который уже предоставляют PCRE, TRE и RE2.


person Gregory Nisbet    schedule 26.07.2015    source источник
comment
Что ответили авторы этих модулей, когда вы их спросили?   -  person Calle Dybedahl    schedule 26.07.2015
comment
Это потому, что в Perl более естественно использовать, например, s/re/repl/, чем вызывать какой-либо метод модуля. также вам придется использовать q/re/ вместо литералов регулярных выражений.   -  person Lucas Trzesniewski    schedule 26.07.2015
comment
@CalleDybedahl Я их не спрашивал. Я подумал, что было бы грубо задать такой простой вопрос непосредственно сопровождающим пакета, а не на более общем форуме.   -  person Gregory Nisbet    schedule 27.07.2015
comment
MarpaX::Languages::M4 — это пример объектно-ориентированного пакета, используя другой механизм регулярных выражений   -  person Jean-Damien Durand    schedule 29.07.2015


Ответы (1)


Мне любопытно... почему модули, которые я видел, являются прагмами, а не более традиционным объектно-ориентированным/процедурным интерфейсом.

Вероятно, потому, что API регулярных выражений Perl, задокументированный в perldoc perlreapi и доступный с версии 5.9.5, позволяет вам Преимущество синтаксического анализатора Perl, который дает вам множество интересных функций с небольшим количеством кода.

Если вы используете API, вы:

  • не нужно реализовывать собственную версию split и оператора подстановки s///
  • не нужно писать собственный код для анализа модификаторов регулярных выражений (msixpn передаются как флаги функциям обратного вызова вашей реализации)
  • может использовать преимущества оптимизации, такие как постоянные регулярные выражения, компилируемые только один раз (во время компиляции), и регулярные выражения, содержащие интерполированные переменные, компилируемые только при изменении переменных.
  • можете использовать qr в своих программах, чтобы цитировать регулярные выражения и легко интерполировать их в другие регулярные выражения
  • может легко устанавливать пронумерованные и именованные переменные захвата, например. $1, $+{foo}
  • не заставляйте пользователей вашего движка переписывать весь свой код, чтобы использовать ваш API; они могут просто добавить прагму

Есть, вероятно, больше, что я пропустил. Дело в том, что с API вы получаете много бесплатного кода и бесплатных функций. Если вы посмотрите на реализацию re::engine::PCRE, для Например, на самом деле он довольно короткий (‹ 400 строк кода XS).

Альтернативы

Если вы просто ищете более простой способ реализации собственного механизма регулярных выражений, ознакомьтесь с re::engine::Plugin , что позволяет вам писать свою реализацию на Perl вместо C/XS. Обратите внимание, что существует длинный список оговорок, включая нет поддержки split и s///.

В качестве альтернативы, вместо реализации полностью пользовательского механизма, вы можете расширить встроенный механизм, используя перегруженные константы, как описано в perldoc perlre. Это работает только в постоянных регулярных выражениях; вы должны явно преобразовать переменные, прежде чем интерполировать их в регулярное выражение.

person ThisSuitIsBlackNot    schedule 26.07.2015