800 likes | 991 Views
PERL.3. Основы языка. Операции ввода-вывода. Операция ввода команды ( `dir` ) Переменная $/ - определяет разделитель элементов списка $/ = “<KATALOG>”; @list=`dir`; Print $list[1], list[2];. Выполнение команды с перенаправлением вывода. $/ = “<KATALOG>”; $list=`dir>flist.dat`;
E N D
PERL.3 Основы языка
Операции ввода-вывода • Операция ввода команды (`dir`) • Переменная $/ - определяет разделитель элементов списка • $/ = “<KATALOG>”; • @list=`dir`; • Print $list[1], list[2];
Выполнение команды с перенаправлением вывода • $/ = “<KATALOG>”; • $list=`dir>flist.dat`; • Print $list;
Операция <> • <STDIN> • <STDOUT> • Perl program.pl par1 par2 par3… • @ARGV
Операция <> (2) while ($line=<>){ print $line; } При передаче программе имени файла, например, его же Perl ex1.pl ex1.pl То программа распечатает содержимое файла
@ARGV • @ARGV=(“file1.dat”, “file2.dat”, “file3.dat”); • For (;<>;){ • … • } • - последовательная обработка строк файлов
Упражнение • Напишите программу, которая копирует один файл в другой.
Функции работы с файлами • Дескриптор файла • Символьная таблица имен 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(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, скаляр, длина); • Прочитать указанное число байт из файла в скалярную переменную. • Возвращает количество прочитанных байт или неопределенность при ошибке. Длина скаляра станет равной количеству считанных байт. Смещение указывают, если данные нужно поместить не с самого начала строки. Положение указателя сохраняется.
Функция Read (2) • Код ниже читает и выводит 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" Невозможно произвести операцию!" • }
Функция Utime и Truncate • Функция Utime • utime (Date1,Date2,список_файлов); • Изменяет дату обращения и модификации файлов из списка. Первые два элемента списка должны указывать новое значение даты обращения и модификации. Возвращает количество измененных файлов. • Функция Truncate • truncate (файл, длина); • Усекает длину указанного файла.
Функция Truncate • print "Content-type: text/html\n\n"; • $string = "This is a sample file"; • print "Write to file: $string<br>"; • open (file,">file.txt"); • print file $string; • close file; • truncate ("file.txt",15); • open (file,"file.txt"); • $string=<file>; • close file; • print "Read from file: ",$string;
Функция Tell • tell (файл); • Возвращает текущую позицию указателя в открытом файле. Если файл не указан, то последнего читаемого файла. • Следующий код читает 15 байт из файла "file.txt". Непременное условие работы этого кода - длина файла должна быть более 15 байт. • print "<pre>"; • open (file, "file.txt"); • while (tell(file) < 15){ • print getc(file); • } • print "</pre>";
Функция Stat • stat (файл); • Возвращает 13 элементный массив параметров указанного файла или пустой список при ошибке. Применяется обычно следующим образом: • ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);
Функция Stat (2) • $dev - имя устройства • $ino - номер i-узла • $mode - права доступа • $nlink - количество связей • $uid - идентификатор владельца • $gid - идентификатор группы • $rdev - тип устройства • $size - размер файла в байтах • $atime - дата последнего обращения • $mtime - дата последней модификации • $ctime - дата последнего изменения статуса • $blksize - размер блока на диске • $blocks - количество блоков в файле.
Функция Stat (3) • Следующий код выводит размер файла в байтах: • $u = (stat("file.txt"))[7]; • print $u; • }
Функция Seek. Функция Chmod • Функция Seek • seek (FileVar, позиция, отсчет); • Установить указатель на произвольную позицию в файле. Если отсчет равен 0 - позиционировать от начала файла, если 1 - от текущего положения, 2 - от конца файла. Возвращает 1 при успехе и 0 - неудаче. • Функция Chmod • chmod (список); • Изменить права доступа к файлам указанным в списке. Первый элемент в списке - числовое ,обычно восьмеричное значение прав. Возвращает количество файлов которым были изменены права. • Пример: • chmod 0666 'f1', 'f2', 'f3';
Упражнения • Напишите программу, которая выводит все сведения об указанном файле или сообщение об ошибке, если файл не найден. Имя файла передается с помощью формы.
Упражнение • Напишите программу, которая проверяет наличие файла index.htm в директории с HTML файлами и при его наличие выдает его браузеру. • Попробуйте использовать разные способы считывания файла (посимвольный и построчный) в зависимости от передаваемого скрипту параметра.
Функции для работы с директориями • Функция Chdir • chdir выражение; • Перейти в директорию указанную выражением. Если выражение отсутствует то перейти в "домашнюю" директорию. Возвращает true в случае успеха и false - неудачи. • Функция Chroot • chroot директория; • Сделать "корневой" указанную директорию. "Корневая" - значит внутри программы на нее можно ссылаться как '/'.
Функции для работы с директориями (2) • Функция Mkdir • mkdir директория, права; • Создать директорию с указанными правами доступа. Возвращает 1 при успехе, и 0 при неудаче. • Функция Opendir • opendir указатель, выражение; • Открыть директорию с именем выражения для обработки функциями readdir(), telldir(), seekdir(), rewinddir() и closedir(). Возвращает true при успехе.
Функции для работы с директориями (3) • Функция Readdir • readdir директория; • Возвращает имя следующего файла в директории открытой командой opendir(). В скалярном контексте возвращает все оставшиеся имена файлов. Если файлов больше нет, то возвращает неопределенность в скалярном контексте и пустую строку в списковом. • Функция Rmdir • rmdir директория; • Удалить указанную директорию, если в ней нет никаких файлов. Возвращает 1 при успехе и 0 - при неудаче. При этом переменная $! содержит код (errno).
Функции для работы с директориями (4) • Функция Seekdir • seekdir директория, позиция; • Установить указатель файла в открытой директории для последующего чтения функцией readdir(). Текущая позиция может быть получена функцией telldir(). • Функция Telldir • telldir директория; • Возвращает текущую позицию указателя в открытой директории.
Функции для работы с директориями (4) • Функция Rewindir • rewindir директория; • Устанавливает указатель файлов открытой директории в начало для последующего чтения функцией readdir().
Встроенные переменные, получение данных методом GET • Когда сервер выполняет скрипт, для него создаются некоторые переменные окружения, среди которых как локальные данные (адрес скрипта на сервере, версия П/О сервера), так и данные полученные с HTTP запросом (версия браузера, IP удаленной машины и т.д.) .
Встроенные переменные • $ENV{'REQUEST_METHOD'} Это одно из самых главных полей, используемых для определения метода запроса HTTP. • $ENV{'QUERY_STRING'} Это строка запроса при методе GET. • $ENV{'CONTENT_TYPE'} Тип тела запроса. • $ENV{'REMOTE_ADDR'} IP-Адрес удаленного Хоста, делающего данный запрос. • $ENV{'REMOTE_HOST'} Если запрашивающий Хост имеет доменное имя, то эта переменная содержит его, в противном случае -тот же самый IP-адресс что и REMOTE_ADDR. • $ENV{'SCRIPT_NAME'} Содержит URL адрес файла скрипта.
Встроенные переменные (2) • $ENV{'SCRIPT_FILENAME'} Полный путь к скрипту на сервере. • $ENV{'SERVER_NAME'} Имя серера ,чаще всего доменное как www.microsoft.com ,но в редких случаях за неимением такового может быть IP-адресом. • $ENV{'SERVER_PORT'} TCP-Порт сервера использующийся для соединения .По умолчанию HTTP-порт 80, хотя может быть в некоторых случаях другим. • $ENV{'SERVER_SOFTWARE'} Программное обеспечение сервера. • $ENV{'AUTH_TYPE'}, $ENV{'REMOTE_USER'} Эти переменные определены в том случае, когда запрошенный ресурс требует аутентификации пользователя.
Встроенные переменные (3) • $ENV{'HTTP_ACCEPT'} Давая запрос на сервер браузер обычно рассчитывает получить информацию определенного формата, и для этого он в заголовке запроса указывает поле Accept:, Отсюда скрипту поступает список тех MIME, которые браузер готов принять в качестве ответа от сервера. • $ENV{'HTTP_USER_AGENT'} Браузер обычно посылает на сервер и информацию о себе, чтоб базируясь на знании особенностей и недостатков конкретных браузеров CGI-скрипт мог выдать информацию с учетом этого. Например, разные браузеры могут поддерживать или не поддерживать какие-то HTML тэги. • $ENV{'CONTENT_LENGTH'} Длина в байтах тела запроса. • $ENV{'GATEWAY_INTERFACE'} Версия протокола CGI. • $ENV{'SERVER_PROTOCOL'} Версия HTTP протокола сервера.
Получение данных методом GET if ($ENV{'QUERY_STRING'}**2 == 0){print $ENV{'QUERY_STRING'}} else{print $ENV{'QUERY_STRING'}**2} @array=($ENV{'SERVER_SOFTWARE'},$ENV{'SERVER_NAME'}); @array=(@array,$ENV{'SCRIPT_FILENAME'},$ENV{'HTTP_USER_AGENT'}); print "<table>"; foreach (@array){ print "<tr><td>$_</td></tr>\n"; } print "</table>"
HTML формы, функция ParseForm • &parse_form; • sub parse_form { • if ($ENV{'REQUEST_METHOD'} eq "POST") {$mode = 0} • if ($ENV{'REQUEST_METHOD'} eq "GET") {$mode = 1} • if ($mode == 0) {read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'})} • if ($mode == 1) {$buffer = $ENV{'QUERY_STRING'}} • @pairs = split(/&/, $buffer); • foreach $pair (@pairs) { • ($name, $value) = split(/=/, $pair); • $value =~ tr/+/ /; • $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; • $FORM{$name} = $value; • } • }
функция ParseForm • Независимо от метода передачи данных, GET или POST эта функция выдает данные в виде переменных вида $FORM{'значение'}. В связи с этим изменились и условия записи данных в строке URL. Теперь их следует писать в таком виде: • "http://.../script.pl?параметр1=значение1 &параметр2=значение2".
ParseForm • print "Content-Type: text/html\n\n"; • &parse_form; • print "A + B = ",$FORM{'a'}+$FORM{'b'},"<br>"; • print "A - B = ",$FORM{'a'}-$FORM{'b'},"<br>"; • print "A * B = ",$FORM{'a'}*$FORM{'b'},"<br>"; • print "A<sup>B</sup> = ",$FORM{'a'}**$FORM{'b'}; • Эта программа выводит сумму, разность, произведение и результат возведения одного числа в другое. Вызывать программу следует таким образом: • "http://.../script.pl?a=значение1&b=значение2", к примеру • "http://.../script.pl?a=256&b=2"
Метод POST • Суть этого метода заключается в передаче данных в теле HTTP запроса, а не в строке URL, как при методе GET. Это снимает ограничения на длину передаваемых данных. • Длина URL не должна превышать 2048 символов. Поэтому целесообразно использовать этот метод, если вы включили в форму областью потенциально большого объема текста.