Полночь. Самое время сесть за комп :) Приступим.
Для начала мы познакомимся с функцией printf. Это тоже функция вывода, как и print, но выводит она форматированые данные. Пример:
#!/usr/bin/perl -w printf("Десятичное:%d\nСимвол:%c\nШестнадцетиричное:%x\nВосьмиричное:%o\nДвоичное:%b", 12,12,12,12,12);
Первым параметром этой функции служит шаблон. В шаблоне символом % задаётся формат вывода:
Как видите число 12 было представлено во всех этих видах.
В Perl нет специальной формы определения типа данных как в Си. В языке Perl данные могут быть числом или строкой символов. И в зависимости от контекста они свободно конвертируются интерпретатором из одной формы в другую. Числа в Perl могут быть:
Истиным Perl считает любое число не равное 0. Строковое значение рассматривается как истинное, если оно не пустое "" или не '0'.
Perl поддерживает три типа переменных: скаляры, массивы и ассоциативные массивы. Как и в языке C, имена переменных пишутся с различением строчных и заглавных букв. Таким образом, имена VAR, Var и var описывают различные переменные. Скрипт может иметь скалярную переменную под именем var и переменную-массив, также названную var. Они будут различаться в языке Perl в соответствии с контекстом. В Perl нет специального оператора объявления переменной, она определяется при первом ее использовании. Переменные можно определять как глобальные (видимые из любой точки программы), так и с помощью функции my как локальные (видимые в определенной части программы - блоке). Для того, чтобы объявить переменную глобальной достаточно её просто не объявить :) В языке Perl имена скалярных переменных всегда начинаются со знака доллара ($). Скаляр может хранить как число ($var = 666), так и строку ($var = "Вася Пупкин - ламер!"). Имена массивов начинаются со знака @. Заполнить массив можно так: @days = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'). А получить доступ к элементу массива так: $days[2]. Можно обратится и к части массива: @weekdays = @days[1..5]. Или к нескольким элементам сразу: @weekend = @days[0,6]. Как и во многих других языках программирования, нумерация элементов массива начинается с нуля. Мы этого всего ещё коснёмся глубже, но позже. На примерах потом будет понятнее. А пока рассмотрим последний тип переменных - ассоциативный массив или хэш.
Программка из предыдущего шага выбирала нам из хэша переменные окружения. Хэши аналогичны обычным массивам в том отношении, что они представляют собой список скалярных переменных. Различие состоит в том, что любой хэш состоит из пар "ключ-значение". Зная имя ключа, можно получить его значение. Пример из жизни: зная фамилию человека, можно найти в телефоном справочнике его номер. Посмотрите ещё раз как это делала программка из предыдущего шага...
Имена ассоциативных массивов начинаются со знака (%), а обращение к элементам происходит так... Давайте лучше на примере :)
%phones; #объявляем хэш-телефонный справочник $phones{'Пожарная служба'} = "01"; #Присваиваем элементу Пожарная служба значение 01 $phones{'Отделение милиции'} = "02"; $phones{'Скорая помощь'} = "03";
Теперь мы можем получить номер отделения милиции следующим образом - $phones{'Отделение милиции'}. Хэш может быть декларирован напрямую как список пар ключ-значение:
%phones = ("Пожарная служба", "01", "Отделение милиции", "02", "Скорая помощь", "03");
Думаю нам полезно будет рассмотреть некоторые функции работы с хэшами:
Есть ещё незнакомые моменты в printenv.pl, но уже многое прояснилось :) Ещё больше прояснится в следующем шаге. И напоследок обещаное объяснение различий между двойными и одинарными кавычками. В строки, ограниченые двойными кавычками, Perl вставляет переменные и спецсимволы, а всё, что в одинарных расценивается как "строка-константа". Т.е. если вы напишите так:
$part = "не"; print "Я $part хочу знать Perl!\n";
Будет выведенно "Я не хочу знать Perl!". А если напишите так:
$part = "не"; print 'Я $part хочу знать Perl!\n';
Будет выведенно "Я $part хочу знать Perl!\n".
З.Ы. Забыл вот ещё о чём: у переменной может быть ещё одно состояние - undef, или если по русски - неопределена. В Perl неопределенные(undefined) переменные трактуются как ложные. Для проверки "определённости" переменной даже функция специальная есть - defined(). Эта функция принимает параметром переменную, и если она определена, то возвращает 1, в противном случае 0.