Язык Perl
Функция 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 имеется большое количество операций, в том числе и весьма экзотических. Поэтому, если возникает сомнение в порядке их вычислений, то всегда можно использовать скобки для управления очередностью вычислений в выражении.