В perl *
обычно жадный, если вы не добавите ?
после него. Однако, когда *
используется против группы, ситуация кажется иной. Мой вопрос "почему". Рассмотрим этот пример:
my $text = 'f fjfj ff';
my (@matches) = $text =~ m/((?:fj)*)/;
print "@matches\n";
# --> ""
@matches = $text =~ m/((?:fj)+)/;
print "@matches\n";
# --> "fjfj"
В первом матче перл лениво ничего не выводит, хотя он мог бы что-то сопоставить, как показано во втором матче. Как ни странно, поведение *
является жадным, как ожидалось, когда содержимое группы просто .
вместо фактических символов:
@matches = $text =~ m/((?:..)*)/;
print "@matches\n";
# --> 'f fjfj f'
- Примечание. Вышеописанное было проверено на perl 5.12.
- Примечание. Неважно, использую ли я захватывающие или не захватывающие круглые скобки для внутренней группы.