Лекция 8 PERL Введение Синтаксис языка. Переменные.
Введение На восемнадцатый год своего существования PERL (Practical Extraction and Reporting Language, Практический Язык для Извлечения текстов и Генерации отчетов) по- прежнему популярен не только среди линуксоидов, но и среди Web- программистов.
Введение Все примеры да и сам язык, описание которого следует ниже - это Perl версии для операционной системы Linux Red Hat версии 7.1 и ActivePerl для Windows 9x/NT/2000. Существуют реализации этого языка для операционных систем OS/2, MS- DOS, но они отстают по возможностям от оригинала, рожденного в Unix.
Синтаксис Perl. Perl программа (скрипт) состоит из последовательности деклараций и предложений. Что должно быть обязательно декларировано, так это форматы отчетов и подпрограммы (функции). Все необъявленные переменные, массивы имеют значение 0 или null.
Синтаксис Perl. Декларации (объявления). Perl имеет свободный формат. Декларации могут использоваться в любом месте программы так же как и предложения (statements), но действуют они только в фазе компиляции программы. Обычно их помещают или в начале или в конце программы. Декларация подпрограмм позволяет использовать имя подпрограммы как списковый оператор, начиная с момента декларирования: sub test;# Декларация подпрограммы $var1 = test $0; # Использование
Синтаксис Perl. Декларации подпрограмм могут быть загружены из файла предложением require или загружены и импортированы в текущую область имен предложением use. Простое предложение. Простое предложение обязательно заканчивается символом ';', если только это не последнее предложение в блоке, где ';' можно опустить. Существуют операторы, такие как eval{} и do{} - это термы и требуют обязательного указания конца предложения.
Синтаксис Perl. Любое простое предложение может содержать модификатор перед ';'. Существуют следующие модификаторы: if EXPR, unless EXPR, while EXPR, until EXPR где EXPR - выражение, возвращающее логическое значение true или false. Модификаторы while и until вычисляются в начале предложения, кроме do, который выполняется первым.
Синтаксис Perl. Сложные предложения. Последовательность простых предложений в ограничителя х, называется блоком. Э то может быть целый файл, последовательность предложений в операторе eval{} или множество простых предложений, ограниченных скобками '{}'. Существуют следующие виды сложных предложений: if (EXPR) BLOCK, if (EXPR) BLOCK else BLOCK, if (EXPR) BLOCK elsif (EXPR) BLOCK... else BLOCK
Синтаксис Perl. LABEL while (EXPR) BLOCK, LABEL while (EXPR) BLOCK continue BLOCK LABEL for (EXPR; EXPR; EXPR) BLOCK, LABEL foreach VAR (LIST) BLOCK LABEL BLOCK continue BLOCK Обратите внимание, что сложные предложения описаны в термах блоков, а не предложений, как в языке C. Поэтому необходимо использовать скобки для обозначения блока.
Синтаксис Perl. Пример $var = 1; if ($var == 0) { print "\$var = 0\n";} elsif ($var == 1) { print "\$var = 1\n";} else { print "Не известное \$var\n";}
Синтаксис Perl. Цикл While. Выполняет BLOCK до тех пор пока EXPR = true. Метка LABEL не обязательна и состоит из идентификатора, завершающегося символом ':'. Метка необходима при использовании внутри блока цикла управляющих операторов next, last и redo. Если метка отсутствует, то эти операторы ссылаются к началу ближайшего цикла. Блок после continue выполняется всегда перед тем, как вычисляется логическое выражение EXPR.
Синтаксис Perl. Операторы управления циклом. next - подобен continue в С. Переходит к началу текущего цикла, т.е. повторяет итерацию. next M1: while ($i < 6) { ++$i; next M1 if $i < 3; ++$i; } continue { print "$i "; }
Синтаксис Perl. last - подобен оператору break в языке С. Немедленно прерывает цикл. Блок continue пропускается. last M1: while ($i < 6) { ++$i; last M1 if $i > 3; ++$i; } continue { print "$i ";}
Синтаксис Perl. redo - начать новый цикл, не вычисляя EXPR и не выполняя continue блок.redo M1: while ($i < 6) { ++$i; redo M1 if $i == 3; ++$i; } continue { print "$i ";}
Синтаксис Perl. Цикл for. Оператор for полностью аналогичен for в С. Перед началом цикла выполняется EXPR1, если EXPR2 = true выполняется блок, затем выполняется EXPR3.Цикл for for ($i = 2; $i < 5; ++$i) { print $i, " ";} print "\nПосле цикла i = $i\n";
Синтаксис Perl. Цикл foreach. Переменной VAR присваивается поочередно каждый элемент списка LIST и выполняется блок. Если VAR опущено, то элементы присваиваются встроенной переменной $_. Если в теле блока изменять значение VAR то это вызовет изменение и элементов списка т.к. VAR фактически указывает на текущий элемент списка. Вместо слова foreach можно писать просто for - это слова синонимы.
Синтаксис Perl. = ("январь","февраль","март"); foreach $i { print $i," ";} foreach $i { $i = uc($i);} for $i (3,5,7) { print "$i "; }
Синтаксис Perl. Блоки и оператор switch. Блок, независимо от того имеет он метку или нет, семантически представляет собой цикл который выполняется один раз. Поэтому действие операторов цикла next, last, redo - аналогично описанному выше. Блоки удобны для построения switch (переключатель) структур. В Perl нет специального оператора switch подобного языку С поэтому вы сами можете создавать удобные для вас конструкции.
Синтаксис Perl. Оператор goto. В Perl реализовано три формы goto. goto - метка, goto - выражение и goto - подпрограмма. goto метка - выполняет непосредственный переход на указанную метку. goto - выражение - Вычисляет имя метки и делает соответствующий переход: goto ("M1", "M2", "M3")[$i]; здесь $i используется как индекс массива указанного непосредственно в выражении. goto подпрограмма.
Синтаксис Perl. POD операторы. В Perl реализован удобный механизм для написания документации в момент создания программы. Для этого применяются специальные POD операторы. Если в теле программы интерпретатор встречает оператор начинающийся с символа '=' например: = head Набор стандартных процедур то пропускается все до слова '=cut'. Затем с помощью программы pod можно отделить текст документации от текста программы.
Переменные. В Perl существует три типа структур данных: скаляры, массивы скаляров и хеши. Э лементы массивов индексируются целыми числами, первый элемент - нулевой. Отрицательное значение индекса обозначает номер позиции элемента с конца. Хеши индексируются строками символов. Имена скаляров всегда начинаются с символа '$' - даже когда обозначают элемент массива: $var1 $var1[0] $var1{'first'}
Переменные. В случае использования имени массива "целиком" или его "среза" перед именем массива @var1{'first','last'} Хеш "целиком" начинается с символа '%': %var, %key, %years Имена подпрограмм начинаются с '&': &sub1, &test_prog, test(12)
Переменные. Каждый тип переменных имеет свою область памяти поэтому $var1 и $var1[0] совершенно разные переменные, хотя $var1[0] часть Так и %var1 - разные массивы переменных. Имена переменных могут содержать любые буквенно-цифровые символы за исключением пробела и табуляции. Большие и малые буквы различаются поэтому $var1 и $Var1 - разные переменные. В Perl по умолчанию имена меток и указателей файлов пишут большими буквами.
Переменные. Контекст. В Perl имеется два главных контекста: скалярный и список (list). Если в левой части выражения имеется ввиду одно единственное значение, то это скалярный контекст. Если множество значений - то список: $var1 = = ; $var1 = = (1,2,3);
Переменные. Скалярные значения. Все данные в Perl это скаляры, массивы скаляров и хеши скаляров. Скалярные переменные могут содержать числа, строки и ссылки. Преобразование числа - строки происходит автоматически по умолчанию. Скаляр име е т только одно значение, хотя может быть ссылк ой на массив. В Perl не существует типов. Это контекстно зависимый полиморфный язык для работы с текстами. Скаляр имеет логическое значение "TRUE" (истина), если это не нулевая строка или число не равное 0.
Переменные. Количество элементов массива является скаляром и начинается символами $#. Фактически $#var1 - это индекс последнего элемента массива. К оличество элементов определяется как $#var1+1. Присвоение значения $#var1 изменит длину массива и разрушит "оставленные" значения. Присвоение значения элементу массива с индексом больше чем $#var1 увеличит размер массива, а присвоение ему нулевого списка - обнулит.
Переменные. В скалярном контексте имя массива возвращает его длину (для списка возвращается последний = (4, 3, 2, 1) $i print $i; Для принудительного получения скалярного значения есть функци я scalar(): print Хеш в скалярном контексте возвращает "true", если существует хотя бы одна пара "ключ-значение". Пример:
Переменные. Конструкторы скаляров. Числа пишутся стандартно: E-10 0xABCD _456_123 Строки ограничиваются одинарными (') или двойными (") кавычками: 'Равняйсь, смирно!' "Построимся и спасемся." В хеше можно опускать кавычки, если индекс не содержит пробелов: $var1{first}; $var1{'first'}
Переменные. Запрещается в кавычках применять зарезервированные литералы: __LINE__ (номер текущей строки программы), __FILE__ (текущий файл). __END__ (кон е ц программы). Весь последующий текст игнорируется, но его можно прочитать, используя указатель файла DATA.
Переменные. В Perl есть возможность вставлять текст документа прямо в программу, используя "here-doc" (здесь текст) метод. Обозначается символами
Переменные. Конструкторы списков. Список - множество значений, перечисленных через запятую и заключенных в круглые = (1, 2, 'привет', 1.2); Можно применять в списке другие списки, но в полученном списке невозможно различить начало и конец включенных списков. = (1, 2, = (6, 7, = 4, 9, 10);
Переменные. Список без элементов обозначается, как (), и называется нуль-списком. Списковое выражение можно употреблять как имя массива, но при этом брать в круглые скобки: print ('январь','февраль','март')[1]; Результат: февраль Список может быть присвоен списку, только если каждый элемент в списке с лев а допустим по типу списку в правой части. Пример: ($a, $b, $c) = (1, 2, 3); print $a, $b, $c;
Переменные. Встроенные переменные Perl. Некоторые переменные имеют в Perl специальные значения. Они состоят обычно только из двух символов, причем первый это '$' символ, и произвольный часто не буквенно-цифровой символ. Если хотите пользоваться их буквенными синонимами, то нужно указать в начале программы: use English; Некоторые из них имеют доступ только на чтение.