Глобальная замена (/g)

Как вы, вероятно, заметили в предыдущих примерах, s/// выполняет только одну замену, даже если в строке возможны и другие совпадения. Конечно, это всего лишь режим по умолчанию. Модификатор /g требует, чтобы оператор s/// выполнял все возможные неперекрывающиеся1 замены:

$_ = "home, sweet home!";
s/home/cave/g;
print "$_\n"; # "cave, sweet cave!"

Глобальная замена часто используется для свертки пропусков, то есть замены всех серий разных пропусков одним пробелом:

$_ = "Input data\t may have extra whitespace.";
s/\s+/ /g; # "Input data may have extra whitespace."

Удаление начальных и завершающих пропусков также выполняется достаточно легко:

s/^\s+//; # Замена начальных пропусков пустой строкой
s/\s+$//; # Замена завершающих пропусков пустой строкой

То же можно было бы выполнить одной командой с альтернативой и флагом /g, но такое решение работает чуть медленнее (по крайней мере, на момент написания книги). Впрочем, ядро регулярных выражений постоянно оптимизируется; информацию о том, из-за чего регулярные выражения работают быстро (или медленно), можно найти в книге Джеффри Фридла (Jeffrey Friedl) «Mastering Regular Expressions»1 (O’Reilly).

s/^\s+|\s+$//g; # Удаление начальных и завершающих пропусков

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
m// в списочном контексте
Другие возможности регулярных выражений
Другие ограничители
Замена с использованием оператора s///
Минимальные квантификаторы