Опубликован: 18.06.2007 | Доступ: свободный | Студентов: 1354 / 35 | Оценка: 4.14 / 3.29 | Длительность: 12:44:00
ISBN: 978-5-94774-604-4
Лекция 14:

Оператор split и функция grep

< Лекция 13 || Лекция 14: 123

14.1.4. Третий операнд (ограничение)

Роль этого необязательного операнда в том, чтобы ограничить число фрагментов, на которые будет разбит заданный текст. Если этот операнд отсутствует, то ограничения нет. Например, оператор

print join '-', split ' ', '       a      b     c      de       ', 3;

напечатает

a-b-c      de

После возврата двух элементов вернется остаток заданного текста. Если в результате текст разобьется на число частей, которое меньше заданного, то дополнительные элементы не создаются. Например:

print join '-', split ' ', '       a      b     c      de       ', 10;

Напечатается: a-b-c-de-. Мы видим, что в этой форме оператор split в отличие от случая, когда третий операнд отсутствует, начинает возвращать конечные пустые элементы.

Также можно ограничить количество возвращаемых значений, если в качестве приемника задать список:

($a,$b,$c) = split /$re/, $text;

После заполнения заданного количества полей Perl прекратит работу оператора split.

Если количество кусков текста меньше заявленного количества элементов списка, то оставшиеся элементы списка получат пустые значения.

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

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

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, которые сами не являются пустыми.

14.1.5. Отсутствие побочных эффектов у оператора split

Оператор split не имеет побочных эффектов: он не изменяет регулярное выражение по умолчанию, не устанавливает специальные переменные $1, …, $`, $&, $' и т.д. Существует лишь один побочный эффект, не связанный с регулярными выражениями: при использовании оператора split в скалярном контексте он записывает возвращаемый результа в массив @_, который также используется для передачи параметров функциям.

При применении директивы use warnings или параметра -w при запуске Perl, выдается соответствующее предупреждение:

#!/usr/bin/perl -w
use strict;

scalar split /(?=\w)/, "abcd";
print @_;

Напечатается

Use of implicit split to @_ is deprecated at z.pl line 4.
abcd

Сказанное об отсутствии побочных эффектов не означает, что внутри регулярного выражения нумерованные переменные не создаются. Если их распечатать во встроенном коде Perl, то мы увидим их значение. Просто после окончания работы регулярного выражения восстанавливаются старые значения всех специальных переменных регулярных выражений. Например, оператор

split /(\w)(?{ print "=$1=" })/, "abcd";

напечатает текст

=a==b==c==d=
< Лекция 13 || Лекция 14: 123
Константин Бражников
Константин Бражников
Россия
Mike .
Mike .
Россия