Я вроде бы думаю, что они здесь, чтобы остаться, так или иначе, особенно в коде. Кодовые побеги были с нами уже более десяти лет.
О них, о том, что они могут вызывать код непредвиденными способами, заботится 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.