Recently in Регулярные выражения и поиск по шаблону Category

Сегодня рассматриваются богатые возможности и нюансы в использовании perl функции split для расщепления строк.

Статья является частью документации  Встроенные функции Perl

  • 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)
    

Statistic

About this Archive

This page is an archive of recent entries in the Регулярные выражения и поиск по шаблону category.

Обработка списков is the previous category.

Указатели файлов, файлы или директории is the next category.

Find recent content on the main index or look in the archives to find all content.