Я думаю, что версия 5.10 и выше, она влияет на буферы захвата, только если было совпадение.
Интересная вещь в вашем примере, что при $string =~ s/^(\t*)([^\t]+)/$2/gi;
она не сбрасывала буферы захвата.Похоже, что это из-за преамбулы, которая оценивает
, если соответствие должно быть проверено.В этом случае ([^\t]+)
потребляет всю строку в первом совпадении
, поэтому произошло string too short
, и буферы никогда не были сброшены.
Я не могу проверить это, но $string =~ s/^(\t*)([^\t])//gi
должен выдать то же предупреждение.
if ( s///g ) {}
, и тестирование буферов захвата в этом случае не обязательно будет содержать
что-либо.Это имело место в версии 5.8.Даже в более поздних версиях это действительно просто функция отладки.
Редактировать @theracoon - в вашем комментарии: "Я вполне уверен, что ([^ \ t] +) фактически не использовал всю строку. Вывод определенно делаетне отражайте это. "
Это доказательство того, что ваше регулярное выражение поглотило всю строку в первом совпадении, проход 1.
На втором проходе не осталось ничего, чтобы соответствовать.Именно так работает модификатор / g.
Он пытается снова сопоставить все регулярные выражения в позиции в строке, где остановилось последнее совпадение.
use re 'debug';
$string = "\t\t\tEntry";
$string =~ s/^(\t*)([^\t]+)/$2/gi;
print "'$string'\n";
Пропуск 1 ..
Соответствие REx "^(\t*)([^\t]+)"
против "%t%t%tEntry"
8 <<code>%t%t%tEntry> <>
Совпадение успешно!
Пропуск 2 ..
Соответствие REx "^(\t*)([^\t]+)"
против ""
(Нет, ничего не найдено)
Слишком короткая строка [regexec_flags] ...
Ошибка совпадения
«Вступление»