Как мне обращаться с регулярными выражениями, помеченными как «предупреждение»? - PullRequest
1 голос
/ 24 ноября 2010

Как мне обращаться с регулярными выражениями, помеченными как «предупреждение», например «(? {Code})», «(?? {code})» или «Специальные глаголы контроля возврата»? Насколько серьезно я должен принять предупреждения?

1 Ответ

4 голосов
/ 24 ноября 2010

Я вроде бы думаю, что они здесь, чтобы остаться, так или иначе, особенно в коде. Кодовые побеги были с нами уже более десяти лет.

О них, о том, что они могут вызывать код непредвиденными способами, заботится use re "eval". Кроме того, сопоставитель регулярных выражений не был повторно введен до 5.12 IIRC, что может ограничить их полезность.

Версия string-eval, (??{ code }), раньше была единственным способом сделать рекурсию, но с 5.10 у нас есть намного лучший способ сделать это; сравнительный анализ различий в скорости показывает, что в большинстве случаев путь eval намного медленнее.

Я в основном использую версию block-eval, (?{ code}), для добавления отладки, что происходит с другой гранулярностью, чем use re "debug". Раньше меня смутно беспокоило, что возвращаемое значение из блочной версии не использовалось, пока я не понял, что было . Вам просто нужно было использовать его в качестве тестовой части условного шаблона, например, этот шаблон для проверки того, состоит ли число из цифр, которые уменьшаются на одну позицию вправо:

qr{
  ^ (
      ( \p{Decimal_Number} )
      (?(?= ( \d )) | $)
      (?(?{ ord $3 == 1 + ord $2 }) (?1) | $)
    ) $
}x

До того, как я выяснил условия, я бы написал так:

qr{
   ^ (  
        ( \p{Decimal_Number} ) 
        (?= $ | (??{ chr(1+ord($2)) }) )
        (?: (?1) | $ ) 
    ) $
}x

что гораздо менее эффективно.

Глаголы контроля возврата более новые. Я использую их в основном для получения всех возможных перестановок совпадения, и для этого требуется только (*FAIL). Я считаю, что это особенность (*ACCEPT), которая особенно отмечена как «очень экспериментальная». Они были с нами только с 5.10.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...