split
Синтаксис
split /PATTERN/, EXPR, LIMIT split /PATTERN/, EXPR split /PATTERN/ split
Описание
Разбивает строку на массив подстрок и возвращает полученный массив в качестве значения.
В случае, если функция вызывается в скалярном контексте, она возвращает количество выявленных
элементов (полей) и помещает результат в массив @_.
ПРИМЕЧАНИЕ
В списочном контексте вы можете принудительно поместить результат работы функции в массив @_,
используя в качестве шаблона ограничителей полей ??, но результат работы функции все равно будет массивом.
Если при вызове функции был опущен аргумент EXPR, производится анализ строки, содержащейся
в переменной $_. Если, кроме того, не указан аргумент PATTERN, разбиение на элементы осуществляется
по обнаружению пробелов, с обрезкой всех стартовых пробелов каждого элемента.
Любое совпадение подстроки с PATTERN рассматривается функцией split как обнаружение ограничителя,
разделяющего два поля. При этом следует иметь в виду, что ограничитель может состоять более
чем из одного символа. Если указан аргумент LIMIT, представляющий собой положительное целое число,
он определяет максимальное количество полей, которое может быть сгенерировано при разбиении строки.
Если же аргумент LIMIT не задан, то пустые поля в конце формируемого массива автоматически отбрасываются.
Если же LIMIT представляет собой отрицательное число, система интерпретирует его как
очень большое положительное и выводит максимальное количество полей.
Шаблон ограничителей, совпадающий с пустой строкой (не путайте с пустым шаблоном — //,
который представляет собой только один из членов семейства шаблонов,
совпадающих с пустой строкой), разобьет значение выражения EXPR на отдельные символы.
Например, результатом следующего использования split:
print join(':', split(/ */, 'Всем привет'));
будет:
'В:с:е:м:п:р:и:в:е:т'.
Довольно часто аргумент LIMIT используется для проведения частичного разбора строки:
($login, $passwd, $remainder) = split(/:/, $_, 3);
При выполнении присвоения значений списку, если аргумент LIMIT не был указан,
Perl присваивает ему значение на единичку большее, чем число переменных в списке, чтобы
сократить до минимума лишнюю работу. В приведенном выше примере LIMIT по умолчанию будет равен 4.
В критических с точки зрения времени выполнения приложениях это достаточно удобно — строка не
будет разбиваться на количество полей большее, чем вам необходимо.
Если шаблон PATTERN содержит скобки, создаются дополнительные элементы массива по мере
выявления каждой удовлетворяющей шаблону подстроки ограничителя:
split(/([,-])/, "1-10,20", 3);
В результате будет сформирован список:
(1, '-', 10, ',', 20)
Если, например, в переменной $header в вашей программе находится полный заголовок
обычного письма электронной почты UNIX, вы можете разбить его на поля и их значения легко и быстро:
$header =~ s/\n\s+/ /g; # Учитываем строки продолжения
%hdrs = (UNIX_FROM => split /^(.*?):\s*/m, $header);
Шаблон /PATTERN/ может быть заменен на выражение, которое оценивается во время выполнения
программы, что позволяет гибко изменять логику работы программы.
ПРИМЕЧАНИЕ
Если вы вычисляете значение шаблона только один раз, это удобнее сделать на этапе
компиляции программы с помощью /$variable/o.
Пример использования split для разбора парольного файла:
open( passwd, '/etc/passwd' );
while (<passwd>) {
($login, $passwd, $uid, $gid, $gcos, $home, $shell) = split(/:/);
...............
}
Анализируя пример, обратите внимание, что в состав переменной $shell будет входить и
символ перевода строки. См. в связи с этим описание
chop,
chomp и
join
Thanks
2023-11-16 22:30:18 Svetlana Thank you very useful information
Оставить комментарий:
|
|