Создание серверных приложений на языке PERL

         

Блокировка файла функция Flock



Блокировка файла, функция Flock

flock(FileVar, operation);

Сразу сделаю небольшую оговорочку, эта функция работает ТОЛЬКО под Unix-подобными операционными системами (Unix, Linux, FreeBSD, SunOS и др.) и Windows NT, W2k, XP...

Необходимость блокировки файлов возникает очень часто когда ваша Perl программа использует данные непосредственно из файлов. Это может быть гостевая книга, форум, чат, счетчик и т. д.
Сначала кажется, что никаких проблем не будет если просто написать код, открывающий файл при необходимости и закрывающий его, после завершения операции чтения/записи:

open(file, "file.txt"); while($string=<file>){ print $string; } close(file);

Если использовать такой код при создании, к примеру, гостевой книги, то существует вероятность, при которой один пользователь добавляет запись, а другой просматривает записи в одно и то же время. Таким образом одновременно два процесса в одно и то же время пытаются выполнить операцию ввода/вывода (в/в) с файлом. Это может привести к серьезным ошибкам, вплоть до потери данных. Для того, чтобы избежать таких ситуаций, необходимо блокировать файл непосредственно перед выполнением операции в/в. В Perl'e есть специальная функция для блокировки файлов, которая используют системные вызовы.

В качестве параметра operation допускаются следующие значения:



"LOCK_SH" или "1" Блокировка для чтения
"LOCK_EX" или "2" Блокировка для записи
"4" "двухстороннее" блокирование
"LOCK_UN" или "8" Разблокирование

Используя эту функцию, можно обезопасить свою программу от ошибки ввода/вывода. Код чтения данных из файла с использованием блокировки может выглядеть так:

open(file, "file.txt"); flock(file, LOCK_SH); while($string=<file>){ print $string; } close(file);

Примечание: Не обязательно файл разблокировывать, т.к. при закрытии файловой переменной, Perl сделает это автоматически.
Код записи данных в файл, с блокировкой:

open (FH, ">>data.tmp"); flock(FH, 2); $str="new line"; print FH $str; flock(FH, 8); close(FH);

Есть одна особенность при использовании блокировки файлов: если к файлу может обратиться хотя бы один процесс, в котором не ставится блокировка, то вся система блокирования становится бесполезной. Другими словами, надо использовать блокировку не только при создании/обновлении/записи в нужный файл, но и в других скриптах, работающих с этими файлом.

* * * *

Напишем скрипт, который записывает в файл переданную ему строчку, и удаляет строку с переданным номером:

#!/usr/bin/perl # programm 13 print "Content-type: text/html\n\n"; &parse_form; print
Добавить запись
Удалить запись номер:
END ; # вывели форму if ($FORM{'action'} eq "add") { # выполняем этот блок когда хотим записать в файл open(file,">>file.txt"); print file "$FORM{'string'}\n"; close file; open(file,"file.txt"); @array=; close file; foreach $i(@array){ $u++; print "$u. $i
"; } } elsif ($FORM{'action'} eq "del") { # выполняем этот блок когда хотим удалить строку open(file,"file.txt"); @array=; close file; open(file,">file.txt"); $size=@array; for($i=0;$i; close file; foreach $i(@array){ $u++; print "$u. $i
"; } } else { # вып. этот код когда хотим просмотреть все записи open(file,"file.txt"); @array=; close file; foreach $i(@array){ $u++; print "$u. $i
"; } }

Возможно, Вам будет трудно поначалу разобраться с работой этой программы. Попробуйте мысленно "запустить" её, представив что Вы - это Perl. Последовательно интерпретируйте код, возможно записывая часть результатов на бумагу. Мысленно подставляйте значения в форму и снова "запускайте" её, тогда Вы быстро поймете работу программы. Важно обладать таким навыком, это впредь поможет Вам находить ошибки в своих и чужих скриптах.

* * * *

Может ли иметь одна программа дескриптор файла "ONE" и метку "ONE" ? Если оператор Print не содержит указания записи в файл, но стоит сразу после оператора Open, сможет ли он записать в файл какую-либо строку? Посмотрите на дерево каталогов, приведенное выше по тексту. Составьте путь к файлу file0.txt относительно file2.txt и наоборот. Составьте абсолютный путь к файлу file.txt, если относительно файла script.pl его путь выгладет так: "/DOCS/file.txt"

Напишите программу, которая создает в директории с HTML документами, HTML файл, в котором записана таблица Пифагора. Откройте этот файл через его URL. Всё ли правильно отображается?

Дополнительный материал: [работа с файлами]  [работа с файлами 2]  [работа с файлами 3]



Bottom


[Содержание]  [Вступление]  [необходимое для начала изучения]  [урок 1]  [урок 2]  [урок 3]  [урок 4]  [урок 5]  [урок 6]  [урок 7]  [урок 8]  [урок 9]  [урок 10]  [урок 11]  [урок 12]  [урок 13]  [урок 14]  [урок 15]  [урок 16]  [урок 17]  [урок 18]  [урок 19]  [урок 20]  [урок 21]  [урок 22]  [урок 23]  [урок 24]  [урок 25]  [урок 26]  [урок 27]  [урок 28]  [правила хорошего тона]  [приложение A]  [приложение Б]  [приложение В]  [заключение]  [благодарности] 



Дополнительные поля HTTP заголовка



Дополнительные поля HTTP заголовка

Далее я расскажу только о 3-х, самых основных полях HTTP заголовка.

Поле Status: передает браузеру код завершения обработки запроса. В случае успешной обработки передается код "200", в случае ошибки на сервере -"500" и т.д.

Поле Location: передает браузеру альтернативный URL. После приема заголовка с таким полем, браузер обычно переходит по означенной в поле ссылке.
Код ниже генерирует заголовок, являющимся скриптом-редиректом:

print "Content-Type: text/html\n"; print "Status: 302 Moved\n"; print "Location: http://goout.ru\n\n";

код 302 означает, что ресурс временно недоступен.



Download



Download

Файл/размер Описание Установка
и настройка
Apache 1.3.9 for Win32 (1999 year)
3 M.
Самый мощный HTTP сервер. Полный аналог Unix-овского сервера читать
Small HTTP Server 3.039 (2002 year)
0.1 M.
Еще один сервер. Ничего общего с Apache не имеет. Download now! читать
Active Perl 5.6.0 Full Stable for Win32 (2001 year)
8 M.
Интерпретатор Perl. В дистрибутив входит также и документация. нет
Windows installer (2001 year)
1.5 M.
Обновление Windows installer. Без него, скорее всего, дистрибутив не проинсталлируется. нет
Active Perl 5.6.0 Small Stable for Win32 (2001 year)
0.7 M.
Усеченная версия Perl. Входят модули: Time, CGI, Strict. Download now! нет
IndigoMail Sendmail 1.17 (2002 year)
1 M.
Утилита Sendmail. Полный аналог Unix-овского crack
DZsoft Perl Editor 5.2 (2002 year)
1.6 M.
Очень мощная программа для разработки CGI скриптов. crack

Скачать программы можно только при наличие подключения к Интернет.



Еще немного об операторе Print



Еще немного об операторе Print

Иногда есть необходимость вывести целый блок однотипной информации. В таком случае использование оператора Print в классическом стиле не совсем удобно. Яркий пример тому программа номер 11: чтобы вывести форму, потребовалось написать оператор Print целых 5 раз, да еще нужно было следить, чтобы перед каждой кавычкой стоял бэк-слэш. Чтобы не возникало подобных неудобств прибегают к методу here-doc. Суть этого метода такова: Прямо в текст программы вставляется фрагмент, предназначенный для вывода, за которым следует выражение-огранечитель. Помимо того, что мы избавляемся от необходимости лишний раз писать оператор print, этот метод хорош и тем, что внутри блока сохраняется форматирование и интерполируются все метасимволы.
Необходимые требования, предъявляемые ограничителям:
1. ограничитель должен быть изолирован, т.е. стоять на следующей строке ПОСЛЕ выводимого блока, и после ограничителя не должно быть никаких символов кроме перевода строки (не путать с метасимвлолм "\n");
2. ограничитель не должен являться зарезервированным литералом (это пока Вам не грозит).
Вот программа 11 с применением метода here-doc:

#!/usr/bin/perl #programm 12 print "Content-Type: text/html\n\n"; &parse_form; print <<OKAY; <form method="get" action="/cgi-bin/script.pl"><br> A =
B = OKAY if ($FORM{'match'} == 1){ print "A + B = ",$FORM{'a'}+$FORM{'b'},"
"; print "A - B = ",$FORM{'a'}-$FORM{'b'},"
"; print "A * B = ",$FORM{'a'}*$FORM{'b'},"
"; print "AB = ",$FORM{'a'}**$FORM{'b'};}

* * * *

Напишите программу, меняющую ключи и значения хеша местами.
Используйте промежуточный массив для решения этой задачи.

Дополнительная информация: [подробно о хешах] [что такое хеши]  [переменные]



Examples


\n"; }

sub print_end { print "Спасибо за отзыв!



Функция ABS



Функция ABS

Возвращает абсолютное значение выражения



Функция Chdir



Функция Chdir

chdir выражение;

Перейти в директорию указанную выражением. Если выражение отсутствует то перейти в "домашнюю" директорию. Возвращает true в случае успеха и false - неудачи.



Функция Chmod



Функция Chmod

chmod (список);

Изменить права доступа к файлам указанным в списке. Первый элемент в списке - числовое ,обычно восьмеричное значение прав. Возвращает количество файлов которым были изменены права.
Пример:

chmod 0666 'f1', 'f2', 'f3';

* * * *

Напишите программу, которая выводит все сведения об указанном файле или сообщение об ошибке, если файл не найден.
Имя файла передается спомощью формы.

Напишите программу, которая выводит указанную строку файла с указанным смещением. Т.е. начинает вывод не с начала. Используйте функции Seek и Getc для решения этой задачи.



Функция Chomp



Функция Chomp

chomp переменная; chomp список; chomp;

Удаляет в конце строки символ указанный переменной $/. Обычно это '\n'. Возвращает количество удаленных символов. Если переменная не указана то используется переменная $_. Если указан список то обрабатывается каждая строка списка и возвращается общее количество удаленных символов.



Функция Chop



Функция Chop

chop переменная; chop список; chop;

Полностью аналогично функции chomp но всегда удаляет последний символ строки.



Функция Chr



Функция Chr

Возвращает символ с заданным ASCII кодом.



Функция Chroot



Функция Chroot

chroot директория;

Сделать "корневой" указанную директорию. "Корневая" - значит внутри программы на нее можно ссылаться как '/'.



Функция COS



Функция COS

Возвращает косинус выражения в радианах



Функция Delete



Функция Delete

delete выражение;

Удалить значение из хеша. Возвращает удаляемое значение или неопределенность, если ничего не удаляется. Удаление из массива окружения $ENV{} - изменяет окружение. Удаление из хеша связанного с базой данных - удаляет запись в базе данных.

#!/usr/bin/perl #programm 19 print "Content-Type: text/html\n\n"; %c=( 'Windows 98' => '1998', 'Windows 2000' => '1999', 'Windows XP' => '2001' ); $flag=1; delete $c{'Windows XP'}; @array=%c; print "\n"; foreach $i(@array){ if($flag==1){$flag=0; print ""; }else{$flag=1; print "\n" }} print "
$i$i
";

Функция Each



Функция Each

each хеш;

Возвращает 2-элементный массив. Первый элемент - ключ второй - значение следующего элемента хеша. Позволяет "просматривать" все значения хеша в определенном порядке. Сброс переменной цикла происходит только после прохождения всего массива. Код ниже выводит все пары ключ-значение из хэша:

%c=( 'Windows 98' => '1998', 'Windows 2000' => '1999', 'Windows XP' => '2001' ); while(($key,$value) = each %c){ print "$key => $value
\n"; };

Функция Eval



Функция Eval

eval выражение;
eval блок;

Выражение сканируется и выполняется как обычная Perl программа. Это делается в контексте текущей программы, поэтому можно использовать уже определенные переменные и подпрограммы. Возвращается результат последнего оператора в блоке или значение оператора return. Если обнаружится синтаксическая ошибка или выполнится оператор die, то возвращается неопределенное значение, а переменная $@ содержит сообщение об ошибке. Если ошибки не было, то $@ содержит нулевую строку. При отсутствии аргумента берется значение переменной $_:

$op = "print(1..10); print\"\n
\""; eval $op; if ($@ eq ""){print "Ошибок не было"} else {print "Переменная \$op содержит ошибки"}

Функция Exists



Функция Exists

exists выражение;

Возвращает true, если существует указанный ключ хеша, даже если не определено его значение.

%hash=( 'Windows 98' => '1998', 'Windows 2000' => '1999', 'Windows XP' => '2001' ); if(exists($hash{"Windows 98"})){ print "Элемент найден"; }else{ print "Элемент не найден"; }

Функция Exit



Функция Exit

exit выражение;

Выполнение программы завершается с кодом выражения.



Функция EXP



Функция EXP

Возвращает e (основание натурального логарифма) в степени выражения



Функция Getc



Функция Getc

getc (FileVar);

Читает и возвращает символ из указанного файла. Если файл не указан, то читается STDIN. После конца файла возвращает пустую строку.
Код ниже читает и выводит 15 байт из файла "file.txt":

open (file,"file.txt"); while ($u<=15){ print getc(file); } continue{$u++} close file;

Функция Gmtime



Функция Gmtime

gmtime выражение;

Переводит местное время, полученное функцией time(), во время по Гринвичу.
Обычно используется в виде:

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=gmtime(time);

* * * *



Функция Goto



Функция Goto

goto метка;
goto выражение;
goto &подпрограмма

Безусловный переход на метку. Нельзя делать переход на метку в структуру, которая должна быть инициирована, например, подпрограмму или цикл foreach и т.д. Вторая форма применяется для динамического определения перехода. Например:

goto ('метка1', 'метка2', 'метка3')[$i];

Здесь при $i = 0 будет переход на 'метка1', $i = 1 на 'метка2' и т.д. Третья форма (goto &подпрограмма) довольно "хитрый" метод подмены имени вызываемой подпрограммы именем текущей. Это используется в методе автозагрузки, когда нужно запустить другую процедуру, но под именем текущей, как будто та была вызвана раньше.



Функция HEX



Функция HEX

Воспринимает выражение как строку шестнадцатеричных цифр и возвращает десятичное значение



Функция INT



Функция INT

Возвращает целую часть выражения



Функция Keys



Функция Keys

keys хеш;

Возвращает массив всех ключей хеша. В скалярном контексте - количество ключей. Порядок следования ключей аналогичен порядку в each функции. Следующий код выводит все ключи хэша:

%hash=( 'Windows 98' => '1998', 'Windows 2000' => '1999', 'Windows XP' => '2001' ); foreach $k (keys %hash){ print "$k
";}

Функция Lc



Функция Lc

Преобразовать строку в буквы нижнего регистра.



Функция Lcfirst



Функция Lcfirst

Заменить первую букву строки на малую.



Функция Length



Функция Length

Возвращает длину строки выражения.



Функция Localtime



Функция Localtime

localtime выражение;

В списковом контексте преобразовывает в 9-и элементарный массив значение, возвращаемое функцией time. Если аргумент опущен, используется сама функция time.
В скалярном контексте возвращает строку, где все даты представлены на естественном языке.
Способ употребления:

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);

Код ниже выводит значения функций time и localtime в списковом и скалярном контекстах:

print time,"
"; print localtime,"
"; $time = localtime(time); print $time;

Функция LOG



Функция LOG

Возвращает натуральный логарифм выражения



Функция Mkdir



Функция Mkdir

mkdir директория, права;

Создать директорию с указанными правами доступа. Возвращает 1 при успехе, и 0 при неудаче.



Функция OCT



Функция OCT

Возвращает десятичное число, представленное восьмеричными цифрами



Функция Opendir



Функция Opendir

opendir указатель, выражение;

Открыть директорию с именем выражения для обработки функциями readdir(), telldir(), seekdir(), rewinddir() и closedir(). Возвращает true при успехе.



Функция Ord



Функция Ord

Возвращает ascii код первого символа выражения.



Функция Pack



Функция Pack

pack (шаблон, список);

Упаковывает список в двоичную структуру по шаблону. Шаблон - это строка символов, описывающая порядок и тип упакованных значений.

A - текстовая строка, добавляется пробелами. a - текстовая строка, добавляется 0 символом. b - битовая строка (возрастающая нумерация бит) B - битовая строка (убывающая нумерация бит) h - шестнадцатеричная строка ( младший байт - первый) H - шестнадцатеричная строка (старший байт первый) c - символ со знаком C - символ без знака. s - короткое целое (один байт) со знаком. S - короткое целое без знака. i - целое (два байта) со знаком. I - целое без знака. l - длинное целое (4 байта) со знаком. L - длинное целое без знака. n - короткое в "сетевом" формате. N - длинное в "сетевом" формате. v - короткое в "VAX" формате. V - длинное в "VAX" формате. f - single float. F - double float. p - указатель на строку ограниченную 0. P - указатель на структуру с фиксированной длиной. u - упаковка uuencode. x - нуль-байт X - резервный байт. @ - заполнить нулями позицию.

За каждой буквой может стоять число означающее количество повторов. Для всех типов за исключением 'a', 'A', 'b', 'B', 'h' и 'H', упаковывается максимально возможное количество значений из списка. Символ '*' после типа означает использовать оставшиеся параметры. Тип 'a' и 'A' использует только одно значение из списка и добавляет остаток поля либо нуль-символами, либо пробелами (при распаковке по типу 'A' пробелы и нули отбрасываются, а по 'a' - нет). Типы 'b' и 'B' упаковывают строку в указанное число бит. Так же как и 'h' и 'H' в число ниблов (байт). 'P' - упаковывает указатель на структуру с указанной длиной. Числа с плавающей запятой (floats и double) записываются в стандартном для каждой машины формате и могут быть разными для разных типов машин. Заметьте, что Perl всегда использует двойную точность (double), поэтому упаковка и распаковка по типу 'f' приведет к потере точности. Шаблоны для распаковки и упаковки совершенно одинаковы.

print(pack("ccc",65,66,67)); # Результат ABC print(pack("A4A3","ab","cdefg")); # "ab cde" print(pack("a4a3","ab","cdefg")); # "ab\0\0cde"

Функция Pop



Функция Pop

pop массив;

Удаляет и возвращает последний элемент массива. Длина массива уменьшается на 1. Результат не определен, если массив пустой. Если имя массива отсутствует, то извлекает из @ARGV для головной программы и @_ для подпрограммы.



Функция Push



Функция Push

push массив, список;

Добавить элементы массива значениями из списка. Длина массива увеличивается на количество элементов списка.



Функция quotemeta



Функция quotemeta

quotemeta выражение;

Вычисляет выражение, в котором метасимволы рассматриваются как обычные символы.



Функция Rand



Функция Rand

Возвращает псевдослучайное число в диапазоне от 0 до значения, указанного в аргументе. Если аргумент отсутствует, то от 0 до 1.



Функция Read



Функция 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;

Функция Readdir



Функция Readdir

readdir директория;

Возвращает имя следующего файла в директории открытой командой opendir(). В скалярном контексте возвращает все оставшиеся имена файлов. Если файлов больше нет, то возвращает неопределенность в скалярном контексте и пустую строку в списковом.



Функция Rename



Функция Rename

rename (старое_имя, новое_имя_файла);

Переименовать файл. Возвращает 1 в случае успеха, иначе - 0.



Функция Reverse



Функция Reverse

reverse список;

В списковом контексте возвращает список с элементами в обратном порядке указанному списку. В скалярном контексте возвращает строку с переставленными символами первого элемента списка.

* * * *

Напишите программу, создающую массив со случайными значениями ячеек, и сортирующий их по убыванию. Напишите алгоритм, удаляющий все ячейки, значения которых ниже среднего значения всего массива. Выведите массив на экран. Сколько ячеек массива было изначально (возьмите для начала 200), и сколько вывелось на экран?

Дополнительная информация: [массивы]



Функция Rewindir



Функция Rewindir

rewindir директория;

Устанавливает указатель файлов открытой директории в начало для последующего чтения функцией readdir().

*Ускоренный курс изучения Perl не подразумевает глубокого изучения функций для работы с директориями. Дополнительная информация по этой теме находится в разделе помощи.

* * * *



Функция Rmdir



Функция Rmdir

rmdir директория;

Удалить указанную директорию, если в ней нет никаких файлов. Возвращает 1 при успехе и 0 - при неудаче. При этом переменная $! содержит код (errno).



Функция SCALAR



Функция SCALAR

Вычисляет выражение в скалярном контексте и возвращает результат. В Perl нет специальной функции для принудительного вычисления в списковом контексте, т.к. для этого достаточно заключить его в круглые скобки



Функция Seek



Функция Seek

seek (FileVar, позиция, отсчет);

Установить указатель на произвольную позицию в файле. Если отсчет равен 0 - позиционировать от начала файла, если 1 - от текущего положения, 2 - от конца файла. Возвращает 1 при успехе и 0 - неудаче.



Функция Shift



Функция Shift

shift массив;
shift;

Удаляет первый элемент массива и возвращает его значение. Если массив пустой, то результат - неопределенность. Если аргумент опущен - обрабатывается массив @ARGV в головной программе или @_ в подпрограмме.



Функция SIN



Функция SIN

Возвращает в радианах синус выражения