Регулярные выражения Perl и их применение
ba2f5a3f

Возвращение пустых элементов


Если между совпадениями для первого операнда нет текста (совпадения идут подряд), то на соответствующих местах возвращаются пустые элементы. Оператор

print join '-', split '=', 'a=b==c';

напечатает

a-b--c

В этом случае пустые элементы, расположенные в конце текста, не возвращаются.

Например, оператор

print join '-',split '=', '===a=b==c===';

напечатает

---a-b--c

Для получения этих пустых элементов надо использвать третий операнд. Проще всего его установить в -1 (или в большое положительное число), тогда вернутся все элементы, на которые разбит текст. Оператор

print join '-', split '=', '===a=b==c===', -1;

напечатает

---a-b--c---

Число -1 здесь эквивалентно бесконечно большому положительному числу.

Иногда бывает нужно получить только непустые элементы разбиения текста. Для этого перед оператором split можно поставить вызов функции grep с аргументом length:

print grep { length } split '=', '===a=b==c===', -1;

или вместо length можно подставить само возвращаемое в $_ split значение:

print grep $_, split '=', '===a=b==c===', -1;

Напечатается просто abc. К каждому элементу списка, возвращаемому оператором split, будет применена функция length. И если результат будет равен нулю, то этот элемент будет удален из данного списка.

Мы уже видели, что пустые фрагменты, совпавшие в начале текста, возвращаются. Но если совпадение было без поглощения текста, а чисто позиционным, то эти пустые фрагменты не возвращаются. Например, оператор

print join '-', split /(?=\w)/, "abcd";

напечатает a-b-c-d, хотя перед буквой a тоже было совпадение.

Обращаю ваше внимание, что оператор

split /^/m, $text;

вернет все логические строки, в том числе и пустые: ведь при совпадении с пустыми строками возвращаются элементы \n, которые сами не являются пустыми.



Содержание раздела