split
для расщепления строк.
- split /PATTERN/,EXPR,LIMIT
- split /PATTERN/,EXPR
- split /PATTERN/
- split
Функция
split
расщепляет строку EXPR на список подстрок и возвращает полученный список. По умолчанию, ведущие пустые поля сохраняются, а замыкающие удаляются.В скалярном контексте, возвращается число найденных полей.
Если опущено EXPR, функция расщепляет строку в переменной
$_
. Если шаблон PATTERN тоже опущен, расщепление производится по пробельным символам (пропуская все ведущие пробельные символы). Все что соответствует PATTERN становится разделителем и не возвращается; исключения из этого правила излагаются ниже. (Разделители могут быть любого размера и не обязательно являются одной и той же строкой в каждом поиске при расщеплении строк)Если число LIMIT задано и больше нуля, оно представляет собой максимальное число полей EXPR, на которые строка расщепляется, хотя фактическое число возвращаемых полей зависит от кол-ва найденных PATTERN в рамках EXPR. Если LIMIT не указан или равен нулю, замыкающие нулевые поля удаляются (о чем не мешало бы помнить тем, кто будет использовать функцию
pop
). Если LIMIT отрицательно, то считается, что была задана произвольно большая граница LIMIT.Шаблон, который может находить соответствие пустой строке (не путать с нулевым шаблоном
//
) или чему-то более длинному, чем нулевая строка, расщепляет значение EXPR на отдельные символы. Например:print join(':', split(/ */, 'hi there')), "\n";
дает результат "h:i:t:h:e:r:e".
Как особый случай для
split
, пустой шаблон//
просто расщепляет строку на отдельные символы; не путать с обычным поиском по шаблону//
, который повторяет поиск по последнему успешно найденному шаблону.print join(':', split(//, 'hi there')), "\n";
выводит 'h:i: :t:h:e:r:e'.
Пустые ведущие поля производятся при наличии положительной ширины совпадений в начале строки; нулевая ширина совпадения в начале строки не производит пустого поля. Например.
print join(':', split(/(?=\w)/, 'hi there!'));
производит на выводе 'h:i :t:h:e:r:e!'. Пустые замыкающие поля с другой стороны, производятся при наличии соответствий в конце строки (и когда LIMIT указан и не равено нулю), независимо от длины сопоставления. Например.
print join(':', split(//, 'hi there!', -1)), "\n"; print join(':', split(/\W/, 'hi there!', -1)), "\n";
производит на выходе 'h:i: :t:h:e:r:e:!:' и 'hi:there:', соответственно, оба с пустым замыкающим полем.
Задание параметра LIMIT влечет расщепление только части строки.
($login, $passwd, $remainder) = split(/:/, $_, 3);
Если осуществляется присвоение списку и пропущен LIMIT или он равен нулю, Perl передает LIMIT на единицу больше, чем число переменных в списке, чтобы избежать лишней работы. Для приведенного выше расщепления, LIMIT будет иметь по умолчанию значение 4. Это полезно в приложениях критичных по времени выполнения, так как строка не расщепляется на большее кол-во полей, чем требутся.
Если PATTERN содержит круглые скобки, создаются дополнительные элементы списка из каждой соответствующей подстроки в разделителе.
split(/([,-])/, "1-10,20", 3);
производит список значений
(1, '-', 10, ',', 20)
Если в переменной $header содержаться заголовки обычного почтового сообщения Unix, можно расщепить его в хэш полей их значений следующим образом:
$header =~ s/\n(?=\s)//g; # слить строки %hdrs = (UNIX_FROM => split /^(\S*?):\s*/m, $header);
Шаблон
/PATTERN/
может быть замещен выражением, определяющим шаблон, который изменяется во время процесса расщепления строк. (Для разовой компиляции во время выполнения используется соответствующий модификатор,/$variable/o
.)Особым случаем является задание в PATTERN одного пробела (
' '
), в этом случае расщепление производится по пробельным символам, как если быsplit
использовался без аргументов. Таким образом, с помощьюsplit(' ')
можно эмулировать режим работы awk по умолчанию, тогда какsplit(/ /)
даст столько нулевых полей в начале (пустых строк), сколько имеется ведущих пробелов.split
с выражением/\s+/
подобенsplit(' ')
за исключением того, что ведущие пробелы производятся в нулевое первое поле.split
без аргументов внутренне интерпретируется какsplit(' ', $_)
.PATTERN
/^/
трактуется как/^/m
, поскольку иначе выражение не имеет смысла.Пример использования функции
split
- обработка записей файла passwd(5) Unix.:open(PASSWD, '/etc/passwd'); while (<PASSWD>) { chomp; ($login, $passwd, $uid, $gid, $gcos, $home, $shell) = split(/:/); #... }
Как и в случае с регулярными выражениями, если даже каким-то парам скобок в PATTERN не найдено соответствия, возвращаются неопределенные значения
undef
.@fields = split /(A)|B/, "1A2B3"; # @fields содержит (1, 'A', 2, undef, 3)