Регулярные выражения также используются в работе оператора 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, используйте несохраняющие круглые скобки (?:).