Оператор split и функция grep
14.1. Оператор split
Оператор разбиения split выполняет в каком-то смысле противоположную роль оператору поиска m/// с модификатором g в списковом контексте. Если этот оператор m/// возвращает все фрагменты текста, которые совпали с регулярным выражением, то оператор split возвращает фрагменты текста, которые не совпали с регулярным выражением, заданным ему в качестве аргумента. Оператор split разбивает исходный текст на куски, которые разделяются текстом, совпадающим с заданным регулярным выражением и возвращает эти куски текста в виде массива. В качестве разделителя может выступать регулярное выражение, которое совпадает только с позицией в тексте, например, оператор
@lines=split /^/m, $text;
вернет в массиве @lines заданный текст, разбитый на логические строки.
Замечу, что в регулярном выражении в операторе split якорь начала текста ^ означает начало логической строки, даже если модификатор m не задан, поэтому оператор
@lines=split /^/, $text;
будет работать точно так же, как и предыдущий оператор с модификатором m. Но можно это неявное правило отменить:
@lines=split /(?-m)^/, $text;
Это будет эквивалентно оператору
@lines=split /\A/, $text;
На метасимвол $ это неявное правило не распространяется.
В регулярном выражении, которое применяется в операторе split, точно так же работает интерполяция переменных и модификатор o, как и в обычных регулярных выражениях.
Оператор split можно использовать в простых случаях, например, когда надо разбить выходные данные от HTML-формы по знаку равенства, но этот оператор можно применять и в более сложных случаях. Однако, оператор split перегружен разными тонкостями и исключениями, которые надо рассмотреть. В общем случае этот оператор имеет вид
split [ совпадение [ , целевой текст [ , ограничение ] ]]
Список операндов при необходимости можно заключать в скобки. Третий операнд не обязателен. Если его значение равно нулю, то это эквивалентно тому, что он не задан.
Второй операнд также не обязателен, но в случае его отсутствия также должен отсутствовать и третий операнд. Не обязателен и первый операнд, оператор
split
эквивалентен вызову
split ' ', $_, 0
где первый операнд является строкой, состоящий из одного пробела. Этот вызов разобьет текст, находящийся в $_, по пробельным символам, при этом начальные и заключительные пустые элементы созданы не будут.
14.1.1. Специальный первый операнд // и ' '
Специальный первый операнд // (пустое регулярное выражение ) означает вовсе не применение регулярного выражения по умолчанию в качестве ограничителя для разбивки текста, а этот операнд разбивает входной текст на отдельные символы, из которых он состоит. Например, оператор
print join '-',split //, 'abcde';
напечатает a-b-c-d-e.
Специальный операнд ' ' (строка из одного пробела), разбивает заданный текст по пропускам \s+, но при этом начальные (и конечные) пробельные символы игнорируются.
Например, оператор
print join '-',split ' ', ' a b c de ';
напечатает a-b-c-de, а оператор
print join '-',split m/\s+/, ' a b c de ';
напечатает -a-b-c-de. Как видим, первый оператор игнорирует начальные и конечные пробелы, а второй - только конечные.
14.1.2. Первый операнд (совпадение)
Рассмотрим варианты для первого операндаоператора split. Это может быть
- регулярное выражение;
- объект регулярного выражения;
- любое другое выражение, которое будет интерпретироваться как строка.
Для регулярных выражений вы можете употреблять лишь базовые модификаторы i, x, s, m, o. Если вы хотите сгруппировать подшаблоны, то используйте несохраняющие круглые скобки, т.к. захватывающие скобки имеют в этом операнде особый смысл.
14.1.3. Второй операнд (целевой текст)
Оператор split не изменяет целевой текст, поэтому в качестве целевого текста можно применять непосредственное значение. Если целевой текст не задан, то используется значение переменной по умолчанию $_.