Опубликован: 23.10.2009 | Доступ: свободный | Студентов: 2818 / 107 | Оценка: 4.28 / 4.22 | Длительность: 17:27:00
Специальности: Программист
Лекция 8:

Переменные Perl

< Лекция 7 || Лекция 8: 12 || Лекция 9 >
Аннотация: В данной лекции рассматриваются основные типы данных интерпретатора языка программирования Perl, а также специальный тип данных - тип "дата". В приложении к данной лекции даны основные функции, необходимые для работы с типами данных в Perl, включая описание синтаксиса и назначения функций.

8.1. Переменные Perl

В языке Perl существует только три типа данных: скалярный тип данных (по-другому - строки из символов), массив скаляров (или просто массивы) и ассоциативные массивы (хэш массивы). Это объясняется тем, что язык Perl предназначен, прежде всего, для обработки символьных данных, и другие операции (например, численные вычисления) носят побочный характер. А для обработки символьной информации этих типов данных вполне достаточно. Ниже дается описание этих типов.

8.1.1. Строки

Строки представляют собой просто последовательность символов. Эта последовательность может содержать и одиночный символ, и целое число, и число с плавающей точкой. Применение конкретной операции к строке определяется ее контекстом - значением и окружающей обстановкой.

Строковые константы бывают двух видов:

  1. Заключенные в апострофы символы. В этом случае все символы воспринимаются "как есть", то есть игнорируются метасимволы, переменные внутри строки и т.п. Например, строка:
    '\\cond = $cond\n'
    Листинг 8.1.
    означает то же самое, что в ней написано.
  2. Заключенные в двойные кавычки символы. В этом случае происходит подстановка метасимволов, замена имен переменных их значением и т.п. Например, строка:
    "\\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-сценариях в Интернете.

< Лекция 7 || Лекция 8: 12 || Лекция 9 >