Блокировка файла функция Flock
Блокировка файла, функция Flock
flock(FileVar, operation);
Сразу сделаю небольшую оговорочку, эта функция работает ТОЛЬКО под Unix-подобными операционными системами (Unix, Linux, FreeBSD, SunOS и др.) и Windows NT, W2k, XP...
Необходимость блокировки файлов возникает очень часто когда ваша Perl программа использует данные непосредственно из файлов. Это может быть гостевая книга, форум, чат, счетчик и т. д.
Сначала кажется, что никаких проблем не будет если просто написать код, открывающий файл при необходимости и закрывающий его, после завершения операции чтения/записи:
Если использовать такой код при создании, к примеру, гостевой книги, то существует вероятность, при которой один пользователь добавляет запись, а другой просматривает записи в одно и то же время. Таким образом одновременно два процесса в одно и то же время пытаются выполнить операцию ввода/вывода (в/в) с файлом. Это может привести к серьезным ошибкам, вплоть до потери данных. Для того, чтобы избежать таких ситуаций, необходимо блокировать файл непосредственно перед выполнением операции в/в. В 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 сделает это автоматически.
Код записи данных в файл, с блокировкой:
Есть одна особенность при использовании блокировки файлов: если к файлу может обратиться хотя бы один процесс, в котором не ставится блокировка, то вся система блокирования становится бесполезной. Другими словами, надо использовать блокировку не только при создании/обновлении/записи в нужный файл, но и в других скриптах, работающих с этими файлом.
* * * *
Напишем скрипт, который записывает в файл переданную ему строчку, и удаляет строку с переданным номером:
#!/usr/bin/perl # programm 13 print "Content-type: text/html\n\n"; &parse_form; printДобавить запись | ||
Удалить запись номер: |
"; } } 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. После приема заголовка с таким полем, браузер обычно переходит по означенной в поле ссылке.
Код ниже генерирует заголовок, являющимся скриптом-редиректом:
код 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:
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 "$i | "; }else{$flag=1; print "$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":
Функция Gmtime
Функция Gmtime
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.
В скалярном контексте возвращает строку, где все даты представлены на естественном языке.
Способ употребления:
Код ниже выводит значения функций 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":
Функция 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
Возвращает в радианах синус выражения