530 likes | 703 Views
PERL.2. Основы языка. Выражения . Терм – любой литерал, любая переменная, любое выражение в круглых скобках, любая строка символов в кавычках, любая функция с параметрами в круглых скобках Функции и операции Print print “0”;. Приоритет операций. Вычисление термов и списковые операции - >
E N D
PERL.2 Основы языка
Выражения • Терм – любой литерал, любая переменная, любое выражение в круглых скобках, любая строка символов в кавычках, любая функция с параметрами в круглых скобках • Функции и операции • Print print “0”;
Приоритет операций • Вычисление термов и списковые операции • -> • ++ -- • ** • ! ~ \ унарные + и – • =~ !~ • * / x % • + - . • << >> • Именованные унарные операции • < > <= >= lt le gt ge • = = != < = > eq ne cmp • | • && • || • .. … • ? : • = **= += -= *= /= %= x= etc • , => • Not • And • Or xor
Контекст • Скалярный • Числовой • Строковый • Безразличный • Булевый • Void-контекст • Списочный
Упражнения • Определите результат выполнения следующих операторов • $var0=2; • $var1=1; • $rez1=$var0**3*2||4+$var1, $var1++; • $rez2=($var1++, $var0**3*2||4+$var1, “6”); • @rez3=($var1++, $var0**3*2||4+$var1, “6”);
Операторы • Выражение, завершенное ; • $n++; • --$n**2;
Модификаторы простых операторов • Каждый простой опреатор может быть снабжен модификатором, представляющим ключевое слово if, unless, while, until, foreach, за которыми стоит выражение-условие • Каждый простой оператор может иметь только один модификатор • $n=$l/$m if $m!=0; • Выражение ключ_слово_модификатора [{]выражение-условие [}]
Модификаторы if и unless • Выражение if выражение-условие; • Эквивалентен if (выражение-условие) {выражение;} • Выражение unless выражение-условие; • Эквивалентен • if (! выражение-условие) {выражение;}
Модификаторы while и until • Выражение while выражение-условие; • Выражение until выражение-условие; Аналогичны • while (выражение-условие) {выражение;} • until (выражение-условие) {выражение;}
Модификатор foreach • Модификатор цикла • Выполняет простой оператор, осуществляя итерации по списку значений, заданных в заголовке • На каждой итерации выбранный элемент списка присваивается встроенной переменной $_, которую можно использовать для получения значения выбранного элемента списка
Модификатор foreach (2) • Выражение foreach выражение-условие; • Соответствует foreach (выражение-условие) {выражение;} • %hash=(one=>6, two=>8, three=>10); • Print ”$_” foreach %hash
Модификатор foreach изменяет значения элементов списка • @array = (1,2,3); • $_ *= 2 foreach @array; • print “@array”;
Составные операторы • Блок – последовательность операторов, заключенных в фигурные скобки • Интерпретатор рассматривает блок как один оператор, вычисляемым значением которого является значение последнего выполненного оператора блока • Блок определяет область видимости переменных – локальные переменные
Локальные переменные • Создаются с помощью функции my(), которая определяет локальные переменные блока • my($var)=“inner”;
Операторы ветвления • If (выражение) Блок • If (выражение) Блок1 else Блок2 • If (выражение) Блок1 elseif (выражение) Блок2 ... else Блокn • Фигурные скобки обязательны даже в случае одного оператора • Во всех операторах ветвления if может быть заменено на unless
Операторы цикла • МЕТКА while (ВЫРАЖЕНИЕ) БЛОК • МЕТКА while (ВЫРАЖЕНИЕ) БЛОК continue БЛОК1 • Необязательная метка – идентификатор с двоеточием • Вместо while можно использовать ключевое слово until
Цикл for • МЕТКА for (ВЫРАЖЕНИЕ1; ВЫРАЖЕНИЕ2; ВЫРАЖЕНИЕ3 ) БЛОК • For позаволяет использовать несколько переменных для управления работой цикла. Для разделения используется запятая for ($j=1, $k=9; $k.o; $j++, $k--) { $hash($j)=$k; }
Цикл foreach • МЕТКА foreach ПЕРЕМЕННАЯ (список) БЛОК • МЕТКА foreach ПЕРЕМЕННАЯ (список) БЛОК continue БЛОК1 • Список задается последовательностью значений, разделенных запятой, массивом скаляров или функцией, возвращающей список
Команды управления циклом • Last идентификатор_метки; • подобен оператору break в языке С. Немедленно прерывает цикл. Блок continue пропускается • Next идентификатор_метки; • подобен continue в С. Переходит к началу текущего цикла (блок continue вычисляется) т.е. повторяет итерацию. • Redo идентификатор_метки; • начать новый цикл не вычисляя EXPR и не выполняя continue блок.
next • M1: • while ($i < 6) • { • ++$i; # Увеличиваем счетчик на 1 • next M1 if $i < 3; # Переходим в начало если $i < 3 • ++$i; # иначе увеличиваем счетчик еще раз на 1 • } • continue • { • print "$i "; # Печатаем $i • } • # получаем 1 2 4 6
last • M1: • while ($i < 6) • { • ++$i; # Увеличиваем счетчик на 1 • last M1 if $i > 3; # Выход из цикла если $i > 3 • ++$i; # иначе увеличиваем счетчик еще раз на 1 • } • continue • { • print "$i "; # Печатаем $i • } • # результат: 2 4
redo • M1: • while ($i < 6) • { • ++$i; # Увеличиваем счетчик на 1 • redo M1 if $i == 3; # Далее пропустить для $i = 3 • ++$i; # иначе увеличиваем счетчик еще раз на 1 • } • continue { • print "$i "; # Печатаем $i • } • # получим 2 5 7
Упражнения • Напишите программу, выводящую все простые числа из диапазона (-28..53) включительно. Есть ли вообще простые числа в этом диапазоне? • Напишите программу, вычисляющую произведение двух соседних числа ряда из диапазона (-28..53), и если это число делится без остатка на 7, выводит результат на экран и увеличивает переменную цикла на 2.
Именованные блоки • Блок операторов, заключенных в фигурные скобки эквивалентен циклу, выполняющемуся только один раз. • Для выхода из него можно использовать команду last, а для повторного вычисления блока - redo
Именованные блоки (2) block1: { $i=1; last block1; } continue { ++$1; } print “\$i posle block1: $i\n”; block2: { $i=1; next block2; } continue { ++$1; } print “\$i posle block2: $i\n”;
Реализация переключателя $var=3; SWITCH: { $case1=1, last SWITCH if $var = = 1; $case2=2, last SWITCH if $var = = 2; $case3=3, last SWITCH if $var = = 3; $nothing =1; }
Оператор безусловного перехода • Goto МЕТКА • Goto ВЫРАЖЕНИЕ • Goto ПОДПРОГРАММА • В Perl метки обозначаются ЗАГЛАВНЫМИ латинскими буквами и отделяются от следующего за ним оператора двоеточием (:).
Функции работы с файлами • Дескриптор файла
Дескриптор файла • Дескриптор файла в Perl-программе — это имя соединения для ввода-вывода между Perl-процессом и внешним миром. • Имена дескрипторов файлов похожи на имена помеченных блоков, но они берутся из другого пространства имен (поэтому у вас может быть скаляр $fred, массив $fred, хеш %fred, метка fred и дескриптор файла fred). • Как и метки блоков, дескрипторы файлов используются без специального префиксного символа, поэтому их можно спутать с существующими или возможными в будущем зарезервированными словами (для команд, подпрограмм и др.).
Открытие и закрытие дескриптора файла • open (FileVar, FileName); • close (FileVar); • Функция Open открывает указанный файл и ассоциирует с ним файловую переменную (дескриптор файла). В зависимости от спецсимвола, стоящего перед именем файла, файл можно открыть с разным способом доступа к нему.
Открытие и закрытие дескриптора файла (2) • open (FV,"FN"); Файл открыт для чтения. Запись в него запрещена. • open (FV,">FN"); Файл открыт для записи. Когда файл открыт таким способом, его содержимое автоматически стирается (а если файл не существует - создается) и в файл можно добавлять данные. • open (FV,">>FN"); Файл открыт для записи в конец. При таком способе открытия файла, тело файла не изменяется и разрешено добавлять строки в его конец. • open (FV,"+<FN"); Файл открыт для чтения и записи. • open (FV,"|FN"); Направить информацию на вход программы. • open (FV,"FN|"); Считать информацию с выхода программы. • open (FV,"|FN|"); И то и другое.
Открытие и закрытие дескриптора файла (3) • Из файла можно считать данные в виде массива и построчно. При считывании файла построчно, какой-то переменной, при первом считывании, присваивается первая строка файла и указатель перемещается на следующую строку. Такое присваивание возвращает True. При втором считывании присваивается вторая строка, при третьем - третья и т.д. до конца файла. Когда указатель дойдет до последней строки, счетчик сбрасывается, указатель перемещается на первую строчку файла, а возвращаемое выражение становится равным False
Открытие и закрытие дескриптора файла (4) • Чтобы считать файл/строку в какую-то переменную, этой переменной присваивают дескриптор файла, заключенный в треугольные скобки: • @array = <FileVar>; • $Var = <FileVar>; • Чтобы закрыть файл, используют функцию Close. Хотя её использование не обязательно, т.к. файл закроется сам после окончания выполнения скрипта, но желательно и является признаком хорошего стиля программирования.
Запись в тело файла • Оператору необходимо указать, в какой именно файл (может быть несколько одновременно открытых файлов) следует выводить информацию, затем помещают выражение, предназначенное для вывода: • open (file,">>file.txt"); • print file «ыывпывапв"; • close file;
Путь к файлу • D:/USR/LOCAL/APACHE • |----> CGI-BIN • | |----> MYDIR • | | |----> file0.txt • | | • | |----> script.pl • | |----> file1.txt • | • |----> HTDOCS • |----> file2.txt • D:/USR/LOCAL/APACHE/CGI-BIN/MYDIR/file0.txt • D:/USR/LOCAL/APACHE/CGI-BIN/file1.txt • D:/USR/LOCAL/APACHE/CGI-BIN/script.pl • D:/USR/LOCAL/APACHE/HTDOCS/file3.txt • MYDIR/file0.txt • file1.txt • ../HTDOCS/file2.txt
Блокировка файла, функция Flock • flock(FileVar, operation); • эта функция работает ТОЛЬКО под Unix-подобными операционными системами (Unix, Linux, FreeBSD, SunOS и др.) и Windows NT, W2k, XP... • В качестве параметра operation допускаются следующие значения: • "LOCK_SH" или "1" Блокировка для чтения • "LOCK_EX" или "2" Блокировка для записи • "4" "двухстороннее" блокирование • "LOCK_UN" или "8" Разблокирование
Блокировка файла • flock(FileVar, operation); • Сразу сделаю небольшую оговорочку, эта функция работает ТОЛЬКО под Unix-подобными операционными системами (Unix, Linux, FreeBSD, SunOS и др.) и Windows NT, W2k, XP...
Блокировка файла (2) • open(file, "file.txt"); • flock(file, LOCK_SH); • while($string=<file>){ • print $string; • } • close(file);
Оператор "-X" • Проверка файла, где 'X' - одно из ниже описанных значений. Это унарный оператор с одним аргументом - либо именем файла, либо указателем файла. Проверяет одно из условий. Если аргумент не указан, то берется значение переменной $_. • это унарный оператор с соответствующим приоритетом. Аргумент можно заключать в круглые скобки.
Оператор "-X« (2) • 'X' имеет следующие значения: • -r Файл разрешен на чтение эффективным uid/gid • -w на запись -//- • -x исполнение -//- • -o принадлежит эффективному uid (идентификатор пользователя) • -R Файл разрешен на чтение реальным uid/gid • -W на запись -//- • -X исполнение -//- • -O принадлежит реальному uid • -e файл существует • -z пустой • -s не пустой
Оператор "-X« (3) • -f обычный текст • -d директория • -l символическая ссылка • -p pipes (конвейер) • -S socket (гнездо) • -b специальное блочное устройство • -c -//- символьное -//- • -t указатель на уст-во tty • -T текстовой файл • -B двоичный • -M "возраст" файла в днях на момент старта скрипта • -A дней с последнего чтения
Оператор "-X« (4) • Если проверяется условие, то возвращает True при истинном утверждении и False при ложном. Код ниже проверяет наличие файла "file.txt" в текущей директории и при его наличие выводит кол-во дней с момента последнего обращения к нему: • if (-e("file.txt")){print (-A("file.txt"))} else {print "Файл не создан"}
Функция Read • read (FileVar, скаляр, длина, смещение); • read (FileVar, скаляр, длина); • Прочитать указанное число байт из файла в скалярную переменную. Возвращает количество прочитанных байт или неопределенность при ошибке. Длина скаляра станет равной количеству считанных байт. Смещение указывают, если данные нужно поместить не с самого начала строки. Положение указателя сохраняется. • Код ниже читает и выводит 15 байт из файла "file.txt": • open (file,"file.txt"); • read("file",$u,5); • print $u,"<BR>"; • read("file",$u,10); • print $u; • close file;
Функция Getc • getc (FileVar); • Читает и возвращает символ из указанного файла. Если файл не указан, то читается STDIN. После конца файла возвращает пустую строку. • Код ниже читает и выводит 15 байт из файла "file.txt": • open (file,"file.txt"); • while ($u<=15){ • print getc(file); • } continue{$u++} • close file;
Функция Rename • rename (старое_имя, новое_имя_файла); • Переименовать файл. Возвращает 1 в случае успеха, иначе - 0.
Функция Unlink • unlink (список) • Удаляет файлы, указанные в списке. Возвращает количество удаленных файлов.
программа, которая создает, переименовывает и удаляет файл delete.me: • print "Content-type: text/html\n\n"; • unless (-e("delete.me") or -e("undelete")){ • open (file,">delete.me") or print "Невозможно создать файл<br>"; • close file; • rename ("delete.me","undelete") and print "Удачно переименован<br>"; • unlink ("undelete") and print "Удачно удален"; • } else { • print" Невозможно произвести операцию!" • }
Упражнение • Напишите программу, которая проверяет наличие файла index.htm в директории с HTML файлами и при его наличие выдает его браузеру. • Попробуйте использовать разные способы считывания файла (посимвольный и построчный) в зависимости от передаваемого скрипту параметра.