Опубликован: 28.04.2014 | Доступ: свободный | Студентов: 155 / 0 | Длительность: 03:30:00
Лекция 5:

Язык Perl

< Лекция 4 || Лекция 5: 12 || Лекция 6 >

Функция split

Функция split получает регулярное выражение и строку и ищет в этой строке все экземпляры указанного регулярного выражения. Те части строки, которые не совпадают с регулярным выражением, возвращаются по порядку как список значений.

Вот, например, код синтаксического анализа разделенных двоеточиями полей, аналогичных тем, которые используются в UNIX-файлах /etc/passwd:

$line =  "merlyn::118:10:Randal:/home/merlyn:/usr/bin/peri ";
@fields = split (/:/,$line); # разбить $line, используя в качестве t разделителя двоеточие
# теперь @fields содержит ( "merlyn ", " ", "118 ", "10 ", #  "Randal ", "/home/merlyn ", "/usr/bin/peri ")

Обратите внимание на то, что второе пустое поле стало пустой строкой. Если вы этого не хотите, задайте сопоставление следующим образом:

Sfields = split(/:+/, $line);

Здесь при сопоставлении принимаются во внимание одно и более расположенных рядом двоеточий, поэтому пустое поле не образуется.

Очень часто приходится разбивать на поля значение переменной $_, поэтому этот случай предлагается по умолчанию:

$ =  "some string ";
Swords = split (/ /); # то же самое, что и Swords = split(/ /, $_); *
# Или две пары, если используется символ из пары  "левая-правая "

При такой разбивке соседние пробелы в разбиваемой строке вызовут появление пустых полей (пустых строк). Лучше использовать образец / +/, а лучше /\s+/, который соответствует одному и более пробельным символам. Этот образец, по сути дела, используется по умолчанию *, поэтому, если вы разбиваете переменную $_ по пробельным символам, вы можете использовать все стандартные значения и просто написать :

Swords = split; # то же самое, что и (Swords = split(/\s+/, $_) ;

Завершающие строки пустые поля в список, как правило, не включаются. Особой роли это обычно не играет. Решение вроде $line = "merlyn::118:10:Randal:/home/merlyn: "; ($name,$password,$uid,$gid,$gcos,$home,$shell) = split(/:/,$line); # разбить $line, используя в качестве разделителя двоеточие просто присваивает переменной $shell нулевое значение (undef), если эта строка недостаточно длинна или содержит в последнем поле пустые значения. (Разбиение выполняется так, что лишние поля просто игнорируются.)

Функция join

Функция join берет список значений и "склеивает " их, ставя между элементами списка строку-связку. Выглядит это так:

$bigstring = join($glue,@list);

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

$outline = join( ": ", @fields) ;

Отметим, что строка-связка - это не регулярное выражение, а обычная строка, состоящая из символов общим числом нуль или более.

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

$result = (join  "+ ",  " ", @fields);

Здесь пустая строка " " рассматривается как пустой элемент, который должен быть связан с первым элементом данных массива @fields. B результате связка помещается перед каждым элементом. Аналогичным образом можно поставить пустой элемент-связку в конец списка:

$output = join ( "\n ", @data,  " ");

* На самом деле образец по умолчанию - строка " ", поэтому начальный пробельный разделитель игнорируется.

Основные операции с числами и строками

Операции (также называемые операторами) в Perl многочисленны и разнообразны, с их помощью образуются арифметические, логические, строковые и другие выражения - конструкции, вычисляющие некоторый результат, хотя он не всегда может использоваться. Элементы выражения, над которыми производится операция, называются операндами. Результат операции в Perl может зависеть от контекста, в котором она выполняется. Но часто и сама операция устанавливает определенный контекст, влияющий на преобразование операндов. Конкретные правила вычисления выражений будут изложены при подробном рассказе о каждой из операций.

Конечно же, в Perl, как и в других языках программирования, есть традиционные арифметические операции:

  • * умножение (например, 2 * 2 будет 4)
  • / деление (например, 11 / 2 будет 5.5)
  • + сложение (например, 111 + "999 " будет 1110)
  • - вычитание (например, '26 ' - 1 будет 25)

В Perl есть еще две очень удобные арифметические операции, которые имеются не во всех языках программирования:

  • ** возведение в степень (например, 2 ** 5 будет 32)
  • % деление по модулю или остаток от деления (например, 11 % 3 будет 2)

В Perl есть отдельные наборы операций для сравнения чисел и строк. Обозначения операций сравнения чисел совпадают с обозначениями операций в других языках, основанных на синтаксисе языка C. В следующих примерах предположим, что в переменной $n хранится значение 25:

  • == равно (не путайте с присваиванием (=), например, $n == 4 ложно)
  • != не равно (например, $n != 8*2 истинно)
  • < меньше, чем (например, $n < '16.08 ' ложно)
  • > больше, чем (например, $n > 9 истинно)
  • меньше или равно (например, $n <= 26 истинно)
  • больше или равно (например, $n >= 24 истинно)
  • <= > числовое сравнение (например, $n <= > 64 вернет -1)

Обозначения операций сравнения строк похожи на обозначения сравнений в языке программирования Fortran. Они применяются, когда сравниваемые величины нужно рассматривать как строки. При сравнении строковых значений учитывается их положение в кодовой таблице символов: чем ближе к началу таблицы, тем меньше значение. В следующих примерах предположим, что в переменной $s хранится 'a ':

  • eq равно (например, $s eq 'a ' истинно)
  • ne не равно (например, $s ne 'Y ' истинно)
  • lt меньше, чем (например, $s lt 'z ' истинно)
  • gt больше, чем (например, $s gt '9 ' истинно)
  • le меньше или равно (например, $s le 'b ' истинно)
  • ge больше или равно (например, $s ge 'Z ' истинно)
  • cmp строковое сравнение (например, $s cmp 'Z ' вернет результат 1)

Последняя операция строкового сравнения cmp, так же, как операция числового сравнения <= >, возвращает одно из значений: - 1, 0 или 1, если первый операнд операции соответственно меньше, равен или больше второго. При сравнении строк имеет значение их длина и содержащиеся в них пробелы: равными считаются посимвольно совпадающие строки одинаковой длины. Операции сравнения строк устанавливают строковый контекст, поэтому их числовые операнды преобразуются к строкам. При этом строковое сравнение чисел дает своеобразный результат, например, '20 ' больше '100 ', поскольку '2 ' находится в таблице символьных кодов позже, чем '1 '. Проверка на частичное совпадение строк, которая часто требуется при обработке текста, выполняется с помощью регулярных выражений.

Перечень операций в языке Perl не ограничивается рассмотренными в этой лекции. По мере изучения других разделов будут описаны другие, более специализированные операции. Например, нам наверняка понадобится операция чтения строки из стандартного входного потока (обычно связанного с системной консолью). Она обозначается символами < > и по- английски называется diamond, что на русский лучше всего перевести как "кристалл " (хотя встречается русское название "ромб "). Эта операция считывает очередную строку и возвращает ее значение: $line = < > # считать в $line строку из стандартного ввода.

Очередность выполнения операций в выражении определяется их приоритетами и ассоциативностью, но она может быть изменена с помощью скобок. Приоритет определяет порядок вычисления операций в выражении: операции с более высоким приоритетом вычисляются раньше. Например, приоритет у операций умножения и деления выше, чем у сложения и вычитания. Ассоциативность определяет порядок вычислений, если в выражении используются операции с одинаковыми приоритетами. Операции с ассоциативностью слева вычисляются обычным образом, слева направо. Но из двух операций, имеющих ассоциативность справа, первой вычисляется стоящая справа.

  • $a ** $b ** $c # ассоциативность справа, т.е. $a**($b**$c)
  • $a * $b / $c # ассоциативность слева, т.е. ($a * $b) / $c
  • $a && $b && $c # ассоциативность слева, т.е. ($a && $b) && $c
  • $a = $b = $c # ассоциативность справа, т.е. $a = ($b = $c)
  • $a | $b ^ $c #, ассоциативность слева, т.е. ($a | $b) ^ $c

В Perl имеется большое количество операций, в том числе и весьма экзотических. Поэтому, если возникает сомнение в порядке их вычислений, то всегда можно использовать скобки для управления очередностью вычислений в выражении.

< Лекция 4 || Лекция 5: 12 || Лекция 6 >
Алина Бёрнс
Алина Бёрнс
Ксения Птицына
Ксения Птицына

Когда можно будет пройти итоговую аттестацию