Оператор split

Регулярные выражения также используются в работе оператора split, который разбирает строку в соответствии с заданным шаблоном. Например, такая возможность пригодится при обработке данных, разделенных символами табуляции, двоеточиями, пропусками… и вообще чем угодно. Оператор split может использоваться в любых ситуациях, когда возможно задать разделитель данных (вообще говоря, он представляет собой простое регулярное выражение). Синтаксис вызова выглядит так:

@fields = split /разделитель/, $строка;

Оператор split ищет совпадения шаблона в строке и возвращает список полей (подстрок), разделенных совпадениями. Каждое совпадение шаблона отмечает конец одного и начало следующего поля. Таким образом, текст, совпадающий с шаблоном, никогда не включается в возвращаемые поля. Типичный вызов split с разделением по двоеточиям:

@fields = split /:/, "abc:def:g:h"; # Получаем ("abc", "def", "g", "h")

Если строка содержит два смежных вхождения разделителя, список даже может содержать пустое поле:

@fields = split /:/, "abc:def::g:h"; # Получаем ("abc", "def", "", "g", "h")

Следующее правило на первый взгляд кажется странным, но редко создает проблемы: начальные пустые поля всегда возвращаются, а завершающие пустые поля отбрасываются.


Пример:

@fields = split /:/, ":::a:b:c:::"; # Получаем ("", "", "", "a", "b", "c")

Операция разбивки также часто выполняется по пропускам с использованием шаблона /\s+/. При таком шаблоне все серии пропусков считаются эквивалентными одному пробелу:

my $some_input = "This is a \t test.\n";
my @args = split /\s+/, $some_input; # ("This", "is", "a", "test.")

По умолчанию split разбивает $_ по пропускам:
my @fields = split; # Эквивалентно split /\s+/, $_;

Это почти то же самое, что разбиение по шаблону /\s+/, если не считать того, что в этом особом случае начальные пустые поля подавляются. Таким образом, если строка начинается с пропуска, вы не увидите пустое поле в начале списка. (Если вы захотите реализовать аналогичное поведение при разбиении другой строки по пропускам, замените шаблон одним пробелом: split ' ', $other_string. Использование пробела вместо шаблона является особым случаем вызова split.) Обычно для разбиения используются простые шаблоны вроде приведенных выше. Если шаблон усложняется, постарайтесь не включать в него сохраняющие круглые скобки, потому что это приводит к активизации «режима включения разделителей» (за подробностями обращайтесь к man-странице perlfunc). Если вам потребуется сгруппировать элементы выражения в шаблоне split, используйте несохраняющие круглые скобки (?:).

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

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