Я знаю правильный способ сделать это, если у меня есть Perl 5.10, это использовать именованные захваты и values %+
, но в Perl 5.8.9 и как я могу получить список успешных захватов? Я придумал два метода, которые оба просто ужасны:
#you need to list each possible match
my @captures = grep { defined } ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16);
и
#ew, I turned on symbolic references
{
no strict 'refs';
my @captures = map { defined $+[$_] ? $$_ : () } 1 .. $#+;
}
Существует третий вариант, который я обнаружил, включающий (?{})
, но он требует глобальных переменных (потому что закрытие происходит во время компиляции) и переводит регулярное выражение из достаточно чистого в безбожный беспорядок.
Единственная найденная мною альтернатива - захватить все совпадение, а затем использовать другой набор регулярных выражений, чтобы получить нужные значения (фактически я строю первое регулярное выражение из других регулярных выражений, потому что нет веских причин для дублирования логики ).
Я, очевидно, пропустил важную часть информации. Я использую регулярное выражение в скалярном контексте вместе с утверждением \G
, потому что регулярное выражение может меняться между совпадениями (один из токенов меняет способ, которым вы выбираете токены из строки). Для примера кода, написанного для Perl 5.10, см. этот вопрос , в частности этот ответ .