8.1. Переменные Perl
В языке Perl существует только три типа данных: скалярный тип данных (по-другому - строки из символов), массив скаляров (или просто массивы) и ассоциативные массивы (хэш массивы). Это объясняется тем, что язык Perl предназначен, прежде всего, для обработки символьных данных, и другие операции (например, численные вычисления) носят побочный характер. А для обработки символьной информации этих типов данных вполне достаточно. Ниже дается описание этих типов.
8.1.1. Строки
Строки представляют собой просто последовательность символов. Эта последовательность может содержать и одиночный символ, и целое число, и число с плавающей точкой. Применение конкретной операции к строке определяется ее контекстом - значением и окружающей обстановкой.
Строковые константы бывают двух видов:
- Заключенные в апострофы символы. В этом случае все символы воспринимаются "как есть", то есть игнорируются метасимволы, переменные внутри строки и т.п. Например, строка:
'\\cond = $cond\n'
Листинг
8.1.
означает то же самое, что в ней написано.
- Заключенные в двойные кавычки символы. В этом случае происходит подстановка метасимволов, замена имен переменных их значением и т.п. Например, строка:
"\\cond = $cond\n"
Листинг
8.2.
означает следующее:
\cond = <значение переменной $cond><перевод строки>
Листинг
8.3.
Здесь метасимвол: '\n' означает перевод строки (переход на новую строку), а '\\' означает знак '\'. Сами знаки " ' " и " " " в строке передаются как метасимволы: " \' " и " \" ".
В таблице 8.1 представлены метасимволы языка Perl, как входящие в состав символьных констант, так и предназначенные специально для регулярных выражений.
Таблица
8.1.
Метасимволы регулярных выражений Perl
Метасимвол
|
Описание |
Примеры |
\ |
Служит для экранирования или маскирования метасимвола, т. е. Использовать его в буквальном значении. |
Фрагменту /\\\*/ соответствует фрагмент текста \* |
. |
Представляет собой любой одиночный символ, кроме символа новой строки. |
Фрагменту /./ будет соответствовать любая непустая строка. Внимание! При установке флага s знаку . Соответствует любой символ. |
[ |
Представляет собой конструкцию […] для представления любого символа из числа заключенных в скобки, т.е. Он представляет собой класс символов. |
Два символа, разделенные знаком "-", задают диапазон значений. |
] |
[^] |
Представляет "исключающий" класс символов. |
Фрагмент [^0-9] означает все нецифровые символы. |
^ |
Этот метасимвол в качестве первого символа регулярного выражения обозначает начало строки. |
Фрагмент /^Perl/ означает слово Perl в начале строки. |
$ |
Этот метасимвол в качестве последнего символа регулярного выражения обозначает конец строки. |
Фрагмент /Perl$/ означает слово Perl в конце строки. |
^$ |
- |
Фрагмент /^$/ означает пустую строку (начало и конец, между которыми пусто). |
| |
Метасимвол можно рассматривать как символ операции, задающий выбор из нескольких операций (подобно логической операции ИЛИ). |
Фрагменту /a|b|c/ соответствует фрагмент текста, содержащий любой из символов: a, b и c. |
( |
Эта пара метасимволов служит для группирования ряда элементов, входящих в состав образца, в один - атом |
Фрагмент /(abc)+/ соответствует повторению последовательности символов abc один или несколько раз, тогда как фрагмент /abc+/ соответствует одиночным символам ab и повторению символа с один или более раз. |
) |
Жадные алгоритмы |
Фрагменты: |
r* |
Ноль или более повторений r. |
|
r+ |
Одно или более повторений r. |
/.*/ - любая строка |
r? |
Ноль или одно повторение r. |
/.+/ - любая непустая строка. |
r{n} |
Ровно n повторений r. |
/[0-9]{3}/ - любая последовательность из трех цифр. |
r{n,} |
n и более повторений r. |
/\[+/ - последовательность, состоящая из любого числа символов [. |
r{n,m} |
Минимум n, максимум m повторений r. |
|
Ленивые алгоритмы |
Фрагменты: |
r*? |
Любой символ или атом, в т.ч. пустой |
|
r+? |
Один символ или атом |
|
r?? |
Любой символ или атом, в т.ч. пустой |
|
r{n,m}? |
Минимум n повторений |
|
Метапоследовательности регулярных выражений Perl
Последовательность |
Описание |
Примеры |
\nnn |
Представляет символ, восьмеричный код которого равен nnn |
|
\xnn |
Представляет символ, шестнадцатеричный код которого равен nn |
|
\cn |
Представляет управляющий символ, который генерируется при нажатии комбинации клавши Ctrl+n |
Фрагменту \cD соответствует Ctrl+D |
\$ |
Символ $ |
|
\@ |
Символ @ |
|
\% |
Символ % |
|
\a |
Звонок |
|
\e |
Символ Esc (ASCII код 27) |
|
\f |
Символ перевода страницы (ASCII код 12) |
|
\n |
Символ новой строки (ASCII код 10) |
|
\r |
Символ "возврат каретки" (ASCII код 13) |
|
\t |
Символ горизонтальный табуляции (ASCII код 9) |
|
\v |
Символ вертикальной табуляции (ASCII код 11) |
|
\s |
Представляет класс пробельный символов
|
|
\S |
Представляет класс непробельных символов. |
|
\d |
Класс цифровых символов (то же самое [0-9]) |
|
\D |
Класс нецифровых символов (то же самое [^0-9]) |
|
\w |
Класс буквенно-цифровых символов [a-zA-Z_0-9] |
|
\W |
Класс небуквенно-цифровых символов. |
|
\A |
Начало строки |
|
\Z |
Конец строки |
|
\b |
Границы слова (между классами \w и \W) |
|
\B |
Обозначает не границы слов |
|
\l |
Первый символ регулярного выражения преобразуется в нижний регистр. |
|
\u |
Первый символ регулярного выражения преобразуется в верхний регистр. |
|
\L …\E |
Означает, что все символы в регулярном выражении между \L и \E преобразуются в нижний регистр. |
|
\U … \E |
Означает, что все символы в регулярном выражении между \U и \E преобразуются в верхний регистр. |
|
\Q … \E |
Означает, что все метасимволы в регулярном выражении между \Q и \E экранируются при помощи метасимвола \ |
Фрагмент /\Q^*?+\E/ аналогичен /\^\*\&\+/ |
\G |
Обозначает точку, в которой закончился предыдущий поиск m//g. |
|
Переменная строкового типа обозначается следующим образом:
$<идентификатор>
Листинг
8.4.
Например:
[Пример 01]
$i = '0';
$String = "Мой папа\n";
Существуют предопределенные Perl переменные строкового типа и функции, применимые только к строкам. Подробную информацию по ним смотри [59] и таблицы 8.2 и 8.3 соответственно.
Примечание: многие функции в языках Perl работают по "текущему контексту". Это значит, что результат функции зависит от того, во-первых, какого типа аргумент у функции, во-вторых, какой тип значений принимает возвращаемое значение функции, и, в-третьих, каково "окружение" этих переменных. Это иллюстрируется [примером 02].
[Пример 02]
$i = 1; $j = 10;
$a = $i + $j # Верно, результат $a=11.0
$b = $j.' '; # Верно, результат $b = '10.0 '
$c = $a + $b; # Ошибка! Складывается число и строка.
Замечание: в отличие от других языков, операция индексирования к строковым данным Perl не применима!
8.1.2. Массивы
Массивы в языке Perl - специальные переменные, содержащие в себе несколько строковых значений. Переменные-массивы обозначаются следующим образом:
@<идентификатор>
Листинг
8.5.
Переменной-массиву может применяться операция индексирования. Ее синтаксис следующий:
$<строковая переменная>=$<переменная-массив>[$<индекс>]
Листинг
8.6.
где $<индекс> - строковая переменная, принимающая целое значение.
Максимальный индекс массива равен:
$<идентификатор массива>
Листинг
8.7.
или
$#<идентификатор массива>
Листинг
8.8.
Первое определение является более новым. Минимальное значение индекса - ноль.
Существуют предопределенные в Perl переменные типа массива скаляров и функции, работающие с этим типом данных. Подробнее о них смотри [59] и таблицы 8.2 и 8.3 соответственно.
Массивы незаменимы в тех случаях, когда необходимо загрузить в память содержимое всего текстового файла.
8.1.3. Ассоциативные массивы
Ассоциативные массивы на языке Perl представляют собой массив парных символьных данных, первая строка которого содержит уникальный ключ, по которому ищется другая строка - значение ключа. Обозначение ассоциативных массивов следующее:
%<идентификатор массива>
Листинг
8.9.
Для присвоения значений ассоциативному массиву необходимо использовать конструкцию:
[Пример 03]
# В этом примере определяются два ассоциативных массива:
# %a и %b, причем они определены одними и теми же данными.
%a = { "key1", "value1", "key2", "value2" };
%b = { "key1" => "value1", "key2" => "value2" };
Доступ к значению хэш массива по его ключу осуществляется с помощью конструкции: $a, где a - идентификатор хэш массива, например:
$str = $a{ "key2" }
Листинг
8.10.
где %a определена в [примере 03], и переменной $str будет присвоено значение: "value2". Аналогично происходит добавление и изменение значения ассоциативного массива по ключу, например:
[Пример 04]
$a{ "key1" } = "значение1"; # Изменение значения ключа "key1"
$a{ "key3" } = "value3"; # Добавление нового элемента в массив
Для хэш массивов определены функции, работающие с этим типом данных. Подробнее о них см. [59].
Хэш массивы широко применяются в CGI-сценариях в Интернете.