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

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

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

flock(FileVar, operation);
Сразу сделаю небольшую оговорочку, эта функция работает ТОЛЬКО под Unix-подобными операционными системами (Unix, Linux, FreeBSD, SunOS и др.) и Windows NT, W2k, XP...
Необходимость блокировки файлов возникает очень часто когда ваша Perl программа использует данные непосредственно из файлов. Это может быть гостевая книга, форум, чат, счетчик и т. д.
Сначала кажется, что никаких проблем не будет если просто написать код, открывающий файл при необходимости и закрывающий его, после завершения операции чтения/записи:
open(file, "file.txt"); while($string=){ 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=){ 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 означает, что ресурс временно недоступен.

    Еще немного об операторе 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;

    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,"
    "; 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

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

    Функция Sleep

    Функция Sleep

    sleep выражение;
    sleep;

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

    * * * *


    Функция Sort

    Функция Sort

    sort подпрограмма список;
    sort блок список;
    sort список;

    Сортирует элементы списка и возвращает полученный список. Несуществующие элементы списка отбрасываются. Если не указано имя подпрограммы или блок, то сортирует в стандартном строковом порядке. Указанная подпрограмма возвращает значения больше, меньше или равное нулю в зависимости от двух соседних элементов списка. Имя подпрограммы может быть указано переменной. Она не должна быть рекурсивной, и два сравниваемых элемента списка передаются как глобальные переменные $main::a и $main::b. Это ссылки, поэтому их изменение приводит к изменению самих элементов списка.

    Функция Splice

    Функция Splice

    splice массив, смещение, длина, список;
    splice массив, смещение, длина;
    splice массив, смещение;

    Удаляет элементы массива, начиная со смещения и указанной длины. Заменяет их указанным списком. Возвращает удаленный список. Если длина не указана, удаляет все элементы списка, начиная со смещения

    Функция SQRT

    Функция SQRT

    Возвращает корень квадратный выражения

    Функция Srand

    Функция Srand

    Задает начальное значение для генератора случайных чисел. Если аргумент отсутствует, то используется текущее машинное время.

    * * * *
    Напишем программу, находящую корни квадратного уравнения:
    #!/usr/bin/perl # programm 18 print "Content-type: text/html\n\n"; &parse_form; $a=$FORM{'a'}; $b=$FORM{'b'}; $c=$FORM{'c'}; print X2 + X + = 0
    EOF ; sub info(){ $Ds=sqrt($D); print "D = $D, Sqtr(D) = $Ds
    \n"; } print "A=$a, B=$b, C=$c

    \n"; $D=(($b**2)-4*$a*$c); if ($D0){ info; print "Первый корень: ",((-$b+$Ds)/(2*$a)); print "
    \n"; print "Второй корень: ",((-$b-$Ds)/(2*$a)) } На мой взгляд, это единственная программа, реализованная абсолютно на всех языках программирования.

    * * * *
    Введите проверку деления на 0 в программе 18.
    Напишите программу, которая создает 10 случайных квадратных уравнений и предлагает пользователю выбрать какое из них она будет решать. Диапазон колебания значений a,b,c - (-15..15) включительно, с шагом 1.


    Функция Sseekdir

    Функция Sseekdir

    seekdir директория, позиция;
    Установить указатель файла в открытой директории для последующего чтения функцией readdir(). Текущая позиция может быть получена функцией telldir().

    Функция Stat

    Функция Stat

    stat (файл);
    Возвращает 13 элементный массив параметров указанного файла или пустой список при ошибке. Применяется обычно следующим образом:
    ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);
  • $dev - имя устройства
  • $ino - номер i-узла
  • $mode - права доступа
  • $nlink - количество связей
  • $uid - идентификатор владельца
  • $gid - идентификатор группы
  • $rdev - тип устройства
  • $size - размер файла в байтах
  • $atime - дата последнего обращения
  • $mtime - дата последней модификации
  • $ctime - дата последнего изменения статуса
  • $blksize - размер блока на диске
  • $blocks - количество блоков в файле.
  • Следующий код выводит размер файла в байтах:
    $u = (stat("file.txt"))[7]; print $u; }

    Функция Substr

    Функция Substr

    substr (выражение, смещение, длина);
    substr (выражение, смещение);

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

    Функция Tell

    Функция Tell

    tell (файл);
    Возвращает текущую позицию указателя в открытом файле. Если файл не указан, то последнего читаемого файла.
    Следующий код читает 15 байт из файла "file.txt". Непременное условие работы этого кода - длина файла должна быть более 15 байт.
    print ""; open (file, "file.txt"); while (tell(file) < 15){ print getc(file); } print "";

    Функция Telldir

    Функция Telldir

    telldir директория;
    Возвращает текущую позицию указателя в открытой директории.

    Функция Time

    Функция Time

    time;
    Возвращает количество секунд, начиная с 1 января 1970 г 00:00:00 UTC. Годы не разделяются на високосные.

    Функция Times

    Функция Times

    times;
    Возвращает 4-х элементный массив значений:
    ($user, $system, $cuser, $csystem) = times;
  • $user - пользовательское время процесса в секундах.
  • $system - системное время текущего процесса.
  • $cuser - время процесса-потомка текущего процесса.
  • $csystem - его системное время.
  • Часто используется для определения времени работы скрипта:
    $start = (times)[0]; # помещяем в самое начало скрипта foreach $i(0..200000){ $u+=$i # что-то делаем } $gen_time = (times)[0]-$start; # а это - в конец скрипта. print "Время работы скрипта:"; print "$gen_time секунд.";

    Функция Truncate

    Функция Truncate

    truncate (файл, длина);
    Усекает длину указанного файла.
    Запишем в файл file.txt строку и усечем его до 15 байт:
    #!/usr/bin/perl # programm 15 print "Content-type: text/html\n\n"; $string = "This is a sample file"; print "Write to file: $string
    "; open (file,">file.txt"); print file $string; close file; truncate ("file.txt",15); open (file,"file.txt"); $string=; close file; print "Read from file: ",$string;

    Функция Uc

    Функция Uc

    Возвращает строку выражения, в которой малые буквы заменены на заглавные.

    Функция Ucfirst

    Функция Ucfirst

    Возвращает строку выражения, в которой первая буква заменена на заглавную.

    Функция Unlink

    Функция Unlink

    unlink (список)
    Удаляет файлы, указанные в списке. Возвращает количество удаленных файлов.

    * * * *
    Напишем программу, которая создает, переименовывает и удаляет файл delete.me:
    #!/usr/bin/perl # programm 14 print "Content-type: text/html\n\n"; unless (-e("delete.me") or -e("undelete")){ open (file,">delete.me") or print "Невозможно создать файл
    "; close file; rename ("delete.me","undelete") and print "Удачно переименован
    "; unlink ("undelete") and print "Удачно удален"; } else { print" Невозможно произвести операцию!" } Я чувствую, что привел Вас в замешательство. Действительно, операторы AND и OR использованы здесь не совсем в "традиционном" контексте.
    Вы знаете, чтобы оператор OR вернул истину, необходимо чтобы хотя бы ОДИН из операндов имел значение ИСТИНА. Чего не скажешь об операторе AND. Для того чтобы он вернул истину, необходимо чтобы ОБА операнда являлись истинными. От сюда следует, что если первый операнд возвращает ИСТИНУ, то оператору OR совершенно не обязательно выполнять второе выражение чтобы чтобы ему самому стать истинным. Аналогично с оператором AND. Если первое выражение возвращает ложь, то второе выполнять не обязательно, т.к. независимо от его значения, AND всё равно вернет ЛОЖЬ.
    Разберем работу AND и OR на примере программы 14.
    С IF (unless) всё прозрачно;
    Функция Open, как известно, возвращает False в случае неудачного открытия файла и ничего не возвращает в случае удачи. Значит если Open вернет False, оператор OR будет вынужден проверить: "а не является второе выражение True?!" и выполнит вывод строки на экран браузера.
    Оператор Rename возвращает кол-во переименованных файлов. Значит, если ему не удастся переименовать 1 файл, он вернет 0, т.е. False.
    В нашем случае если Rename вернет 1, т.е. True, оператор AND должен будет проверить на истинность второе выражение и выполнит вывод на экран браузера. Если же Reneme вернет False, второе выражение выполнено не будет.

    * * * *
    Напишите программу, которая проверяет наличие файла index.htm в директории с HTML файлами и при его наличие выдает его браузеру. Т.е. Вам нужно его полностью считать и распечатать.
    Попробуйте использовать разные способы считывания файла (посимвольный и построчный) в зависимости от передаваемого скрипту параметра.


    Функция Unpack

    Функция Unpack

    unpack (шаблон, выражение);
    Функция, обратная pack(). Распаковывает строку выражения по указанному шаблону в массив значений. В скалярном контексте возвращает значение только первого элемента. Шаблоны такие же как и в pack().
    Символ '%' в шаблоне означает, что вы хотите получить вместо значения его контрольную сумму. По умолчанию - 16-битную.

    * * * *
    Напишите программу, выводящую латинский алфавит. ASCII код первой буквы алфавита - 65. В латинском алфавите 25 букв.
    Попробуйте записать в файл IP адрес, затем считать его и сравнить (программно с помощью оператора IF) его с текущем IP адресом. Почему, как вы думаете, они не совпали?
    запись IP адреса осуществляйте такой строкой:
    print "$ENV{'REMOTE_ADDR'}\n";

    Функция Unshift

    Функция Unshift

    unshift массив, список;
    Противоположное shift. Помещает элементы списка в начало массива.

    Функция USE

    Функция USE

    use модуль список use модуль Указывает библиотечный модуль, из которого можно вызывать подпрограммы. Список перечисляет имена подпрограмм, которые добавляются к текущей области имен. Если не указан, то все имена. Действие аналогично блоку:
    BEGIN { require модуль; import модуль список; } Сам модуль должен располагаться в системной области Perl файлов.

    И так, основные правила этикета, которых нужно придерживаться при написании программ:
  • Вызывать Perl интерпретатор нужно с параметром "-w". Это заставит его более тщательно анализировать код с целью выявления сбойных или потенциально сбойных участков;
  • Используйте в программе прагму (модуль) Strict. Аналогично предыдущему пункту, но код анализируется еще строже;
  • Описывайте все переменные, которые используете в программе. Описать переменную можно оператором my();
  • Не проводите никаких операций над не определенными или не существующими переменными, ячейками массива или ключами хеша. Программно проверяйте "наличие" ячейки массива или ключа хеша перед операцией, если не уверенны в их существовании на момент использования;
  • Давайте переменным "говорящие" имена. Это облегчит жизнь Вам и Вашим коллегам при анализе кода;
  • Не используйте оператор goto!
  • Старайтесь не создавать рекурсивных функций (функции, которые вызываются сами из-под себя), они иногда приводят к возникновению "вечных циклов". А это в свою очередь является ошибкой программирования;
  • Сопровождайте комментариями все строки кода, которые могут интерпретироваться читателем двояко или будут непонятны.
    Вообще, комментарии никогда не бывают лишними. Код, где комментирована буквально каждая строка легко читается и отлаживается; они помогут Вам вспомнить и разобраться в коде, который вы когда-то начали писать, но, по каким-то причинам, не закончили;
  • Не пишите строки, которые выходят за пределы экрана. Оптимальным кол-вом символов в строке является 66-88;
  • В блоках кода (участках, заключенных в фигурные скобки) текст должен иметь выступ в 1 табуляционный символ или в 5 пробельных символов;
  • Не пишите код сплошным текстом. Разбивайте его на функциональные участки и оформляйте их в процедуры;
  • Перед выполнением операции деления проверяйте, не производится ли деление на ноль;
  • Перед открытием файла проверяйте его на предмет существования и возможности открытия (бывает так, что файл существует, но занят другим приложением);
  • Используйте альтернативные операции при невозможности выполнить какое-либо действие. К примеру, используйте операторы || (or) и die, если имеет место ошибка при открытии файла.
  • Из всего вышесказанного, грамотно написанная программа выглядит примерно так:
    #!/usr/bin/perl -w use strict; print "Content-type: text/html\n\n"; my ($summ,$i); $summ=0; for ($i=-5;$i<=5;$i++){ $summ+=10/$i if $i != 0; } print $summ; # выводим сумму результатов деления 10 на # диапазон от -5 до 5

    Функция Utime

    Функция Utime

    utime (Date1,Date2,список_файлов);
    Изменяет дату обращения и модификации файлов из списка. Первые два элемента списка должны указывать новое значение даты обращения и модификации. Возвращает количество измененных файлов.

    Функция Values

    Функция Values

    values хеш;
    Возвращает обычный массив со всеми значениями хеша. В скалярном контексте возвращает количество значений хеша.
    %hash=( 'Windows 98' => '1998', 'Windows 2000' => '1999', 'Windows XP' => '2001' ); foreach $k (values %hash){ print "$k
    "; }

    * * * *


    Help

    Help

    Ссылка Описание
    LAMABOOK Замечательная книжка Рэндала Шварца, которая реально поможет Вам изучить Perl. Почти в каждом уроке я ссылаюсь на неё как на дополнительный материал.
    BOOK Очень хорошее пособие по изучению Perl. Автор Маслов Владимир Викторович
    BOOK #2 Выжимка одной из книг Р.Шварца
    [FAQ по Perl] Небольшое FAQ по Perl, любезно предоставленное Webscript.ru
    [подробно об HTTP] Статься о протоколе HTTP. Взято с perl.ru
    [подробно о хэшах] Название говорит само за себя. Взять также с perl.ru
    [массивы] Примеры скриптов, использующих массивы. Взято с perl.ru
    [регулярные выражения] Очень подробный материал, настоятельно рекомендую прочитать. Взято с perl.ru
    [права доступа] Статья рассказывает о том, как правильно нужно выставлять права доступа для CGI скриптов
    [работа с файлами] Довольно неплохо описаны функции для работы с файлами. Взято с Webscript.ru
    [работа с файлами 2] Очень подробная статья с примерами. Взято с Webscript.ru
    [установка CGI скриптов] Подробная статья о том как правильно установить CGI скрипт. Взято с Webscript.ru
    [пособие от Леши] Довольно толковое пособие по CGI программированию от некоего Леши.
    [коротко о SSI] Коротко о SSI. Предоставлено Кормушкой.РУ
    [подробно о SSI] Всё от туда же
    [Perl = простота Basic + мощь Cи++] Статья Михаила Евдокимова о Perl-е.
    [Спецификация языка Perl] Справочник по Perl, автор Алена Федосеева
    [Работа с cookies на Perl] Работа с Cookies с использованием модуля CGI
    [Что такое Cookies и с чем их едят] Работа с Cookies, взгляд изнутри


    Кнопки

    Кнопки

    Просто кнопки, как таковые, для CGI программиста бесполезны, т.к. для их программирования необходимо знать языки, работающие на локальном браузере (JavaScript, VBScript и др.). Больший же интерес представляют заранее запрограммированные кнопки "Submit" и "Reset". Первая, как Вы уже знаете, отправляет данные скрипту, вторая - обнуляет все эл-ты формы.
    Для создания многих элементов формы, в том числе и кнопок, служит тэг . Самым главным параметром этого тега является "type", т.к. в нем задается тип эл-та формы. Чтобы создать кнопку, значением этого параметра должно быть "button". Вот код самой простой кнопки: . Если Вы передадите этот код браузеру, то увидете что этой кнопкой практически нельзя пользоваться, т.к. она очень маленькая и не имеет надписи. Надпись можно задать в параметре "value". Еще у кнопок есть атрибут "disabled", который превращает эту кнопку в декоративную:


    Кнопка "Submit" создается такми же образом, только значение параметра "type" должно быть "submit". Анологично с кнопкой "Reset":



    Общее количество посещений:

    Общее количество посещений: [an error occurred while processing this directive]

    Метод POST

    Метод POST

    8-/ наконец-то закончили с формами, осталось рассказать только о методе POST.
    Суть этого метода заключается в передаче данных в теле HTTP запроса, а не в строке URL, как при методе GET. Это снимает ограничения на длину передаваемых данных. Напомню, что длина URL не должна превышать 2048 символов. Поэтому целесообразно использовать этот метод, если вы включили в форму областью потенциально большого объема текста.

    * * * *
    Модернизируем программу 10 с учетом полученных знаний так, чтобы вводить данные не вручную в поле URL, а в текстовые поля.
    #!/usr/bin/perl #programm 11 print "Content-Type: text/html\n\n"; &parse_form; print "script.pl\">
    \n"; print "A =
    \n"; print "B = \n"; print ""; print "

    \n"; 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'};}

    * * * *
    Напишите программу, которая запрашивает кол-во текстовых полей и выводит их одно под другим. Напротив каждого поля должна располагаться "галочка". По нажатию на "submit", форма передается скрпту, который выводит значение только тех полей, напортив которых "галочка" была отмечена. Ограничите максимальное количество полей значением 10, а минимальное - тремя. Используйте метод Post при передаче формы.


    MIME

    MIME

    MIME (Multipurpose Internet Mail Extensions) - Многоцелевые расширения почты интернета, были разработаны как стандарт идентификации различных типов файлов для отправки их по почте, но в последствии их функции были расширены и на другие сервисы Интернета. Для типа MIME, который прописывается в реестре Windows и используется различными программами, в частности, указывается расширение файла и программа, с помощью которой данный тип файлов будет обрабатываться.
    Типы MIMEТип файла
    Архив RARapplication/x-tar
    Архив ZIPapplication/x-zip-compressed
    Исполняемый файл (.exe)application/octet-stream
    Аудио- или видеозапись ASFvideo/x-ms-asf
    Аудио- или видеозапись WMVvideo/x-ms-wmv
    Аудиозапись AIFFaudio/aiff
    Аудиозапись AUaudio/basic
    Аудиозапись MIDIaudio/mid
    Аудиозапись MP3audio/mpeg
    Аудиозапись WAVaudio/wav
    Аудиозапись WMAaudio/x-ms-wma
    Аудиозапись AVIvideo/avi
    Аудиозапись AVI (.avi)video/x-msvideo
    Видеозапись Indeo (IVF)video/x-ivf
    Видеозапись MPEG (.mpeg .mpg .mpe)video/mpeg
    Видеозапись QuickTime (.qt .mov)video/quicktime
    Визитная карточка, используемая почтовыми программами для хранения данных об адресатеtext/x-vcard
    Графический файл ARTimage/x-jg
    Графический файл BMPimage/bmp
    Графический файл GIFimage/gif
    Графический файл JPEGimage/jpeg
    Графический файл Macromedia Flashapplication/futuresplash
    Графический файл TIFFimage/tiff
    Документ Adobe Acrobatapplication/pdf
    Документ HTMLtext/html
    Документ Microsoft Excelapplication/x-msexcel
    Документ Microsoft Wordapplication/msword
    Документ RTFapplication/msword
    Документ RTXtext/richtext
    Документ XMLtext/xml
    Приложениеapplication/x-msdownload
    Приложение HTML (HTA)application/hta
    Таблица стилей HTMLtext/css
    Текстовой документtext/plain


    Область многострочного редактирования

    Область многострочного редактирования

    Её еще называют областью потенциально большого объема текста. Синтаксис её таков:


    У этого тега есть дополнительные параметры и атрибуты:
    name имя области
    rows кол-во строк области в символах
    cols ширина области в символах
    А роза упала на лапу Азора


    Оператор do

    Оператор do

    do {operator} while (EXPR) do {operator} until (EXPR)
    Оператор while/until проверяет условие в начале каждого цикла, до входа в него. Если результат проверки условия — "ложь", цикл не будет выполнен вообще.
    Иногда возникает необходимость проверять условие не в начале, а в конце цикла. Для этого в Perl есть оператор do {} while, который очень похож на обычный оператор while, за исключением того, что он проверяет выражение только после однократного выполнения цикла.

    * * * *
    Приведенная ниже программа демонстрирует работу оператора While.
    #!/usr/bin/perl #programm 7 print "Content-Type: text/html\n\n"; $i=1; while($i<9){ print "$i X 7 = ".$i*7; print "
    "; }continue{$i++}

    * * * *
    Модернизируйте программу, которая выводит таблицу Пифагора (Всё равно какую) так, чтобы вместо оператора For в ней использовались операторы While и Until.
    Дополнительная информация: [Управляющие структуры ] [Управляющие структуры 2 ]


    Оператор Foreach

    Оператор Foreach

    foreach VAR (LIST) {operator}
    Переменной VAR присваивается поочередно каждый элемент списка LIST и выполняется блок. Если VAR опущено, то элементы присваиваются встроенной переменной $_. Если в теле блока изменять значение VAR то это вызовет изменение и элементов списка т.к. VAR фактически указывает на текущий элемент списка. Вместо слова foreach можно писать просто for - это слова синонимы.
    оператор ..
    Элемент списка может включать операцию конструктора списка. Это два скалярных значения, разделенных двумя точками. Данная операция создает список значений, начиная с левого скалярного значения и кончая правым скалярным значением, с шагом 1.
    Если правый скаляр меньше левого, то список будет пустым, так как в обратном направлении отсчет вести нельзя. Если последнее значение не соответствует целому числу шагов, то список заканчивается там, где приращение на единицу привело бы к появлению числа, не принадлежащего заданному диапазону. Ниже приведенная программа демонстрирует работу операторов foreach и "..":
    #!/usr/bin/perl print "Content-Type: text/html\n\n"; @array=(1..10); foreach $a(@array){ print ($a,"
    "); }

    * * * *

  • Как изменится длина 8-и элементного массива, если 2-ум его ячейкам присвоить пустую строку ("") ?
  • Если значения ячеек совпадают с номерами их индексов, то какое значение записано в 9-й ячейке массива?
  • Анологичный 9-и элементный массив. Какое значение будет записано в ячейке с номером "-1" ?
  • Какое число элеменотов вернет такая конструкция: ('3.8'..'9.1') ?
  • Напишите программу, выводящую все простые числа из диапазона (-28..53) включительно, используя конструктор списка и оператор Foreach. Какое минимальное кол-во переменных требуется для написания такой программы?


    Оператор GOTO

    Оператор GOTO

    goto метка;
    Можно теоретически показать, что рассмотренных операторов вполне достаточно для написания программ любой сложности. В этом отношении наличие в языке оператора перехода кажется излишнем. Более того технология структурного программирования основана на принципе "программирование без GOTO": считается, что использование оператора перехода затрудняет понимание программы, делает её запутанней и сложной в отладке.
    Тем не менее, в некоторых случаях использование оператора перехода может упростить программу.
    В Perl метки обозначаются ЗАГЛАВНЫМИ латинскими буквами и отделяются от следующего за ним оператора двоеточием (:).

    Оператор Grep

    Оператор Grep

    grep {блок} список;
    grep (выражение, список);

    Выполнят блок или выражение для каждого элемента списка. Переменная $_ содержит текущий элемент. Возвращает список элементов, с которыми выражение дало результат true. В скалярном контексте возвращает количество результатов true. Как видите, grep очень похож на foreach:
    @tmp=(1,2,3); grep{print $_} @tmp;

    Оператор Last

    Оператор Last

    last - подобен оператору break в языке С. Немедленно прерывает цикл. Блок continue пропускается

    Оператор m//

    Оператор m//

    m/PATERN/gimosx;
    /PATERN/gimosx;

    Поиск в строке по паттерну (шаблону). В скалярном контексте возвращает логическое значение true (1) или false (''). Если строка не указана с помощью операторов '=~' или '!~', поиск ведется в строке $_ . Опции:
    g - Глобальный поиск. Поиск всех вхождений.
    i - Сравнение не зависит от регистра (верхний или нижний)
    m - Строка многострочная.
    o - однопроходная компиляция
    s - однострочная строка
    x - используются расширенные регулярные выражения.
    Если '/' - ограничитель, то начальное 'm' можно опустить. С помощью него в качестве ограничителя может быть любой символ кроме пробела.
    PATTERN может содержать переменные, которые будут интерполироваться (перекомпилироваться) каждый раз в момент вычисления. Переменные $) и $| не интерполируются. Если вы хотите, что бы такой шаблон интерполировался один раз - добавьте /o. Это необходимо делать в циклах поиска для увеличения быстродействия, однако, если вы измените значение переменной, Perl этого даже не заметит.
    Если PATERN - нулевая строка, то используется последнее регулярное выражение.
    В скалярном контексте возвращается список элементы которого - результаты выполнения выражений в скобках паттерна ($1, $2, $3...). Обратите внимание что первый элемент $1.

    Оператор Map

    Оператор Map

    map {блок} список;
    map выражение, список;

    Выполняет блок или выражение для каждого элемента списка. Возвращает список результатов.
    @tmp=(1,2,3); $v = map $i.=$_, @tmp; print $i,"
    "; print $v;

    * * * *


    Оператор Next

    Оператор Next

    next - подобен continue в С. Переходит к началу текущего цикла (блок continue вычисляется) т.е. повторяет итерацию.

    Оператор q//

    Оператор q//

    q/строка/;
    'строка';

    Не интерполируемая строка литералов. Если в качестве разделителя используется одинарная кавычка, ключевое слово "q" можно опускать.
    Сами того не зная, Вы используете этот оператор почти с самого первого урока.
    print q^Windows 3.11^; # результат: Windows 3.11 print q?Windows 98?; # результат: Windows 98 print 'Windows 2000'; # результат: Windows 2000

    Оператор qq//

    Оператор qq//

    qq/строка/;
    "строка";

    Интерполируемая строка. Если в качестве разделителя используется двойная кавычка, ключевое слово "qq" можно опускать.
    $var311 = "3.11"; # определяем переменные $var98 = "98"; print qq#Windows $var311#; # результат: Windows 3.11 print qq+Windows $var98+; # релультат: Windows 98 print "Windows 2000"; # результат: Windows 2000

    Оператор qw//

    Оператор qw//

    qw/строка/;
    Возвращает список, элементы которого содержат слова из строки. Т.е. пробелы рассматриваются как символы-разделители.
    Следующий код подчеркнет все слова фразы, длиной 7 букв:
    @array = qw(Пока толстый сохнет, худой - сдохнет); foreach $i(@array){ if (length($i) == 7){print "$i "} else {print "$i "} }

    Оператор qx//

    Оператор qx//

    qx/строка/;
    `строка`;

    Сначала строка интерполируется, а потом выполняется как системная команда.
    print ""; print `dir`; print ""; Этот код выведет очень много ценной информации ;-) . Не забудьте переключить кодировку браузера в "DOS".

    Оператор Redo

    Оператор Redo

    redo - начать новый цикл не вычисляя EXPR и не выполняя continue блок.

    * * * *
    Пример применения оператора next:
    #!/usr/bin/perl print "Content-Type: text/html\n\n"; M1: while ($i < 6) { ++$i; # Увеличиваем счетчик на 1 next M1 if $i < 3; # Переходим в начало если $i < 3 ++$i; # иначе увеличиваем счетчик еще раз на 1 } continue { print "$i "; # Печатаем $i } # получаем 1 2 4 6 Пример применения оператора last:
    #!/usr/bin/perl print "Content-Type: text/html\n\n"; M1: while ($i < 6) { ++$i; # Увеличиваем счетчик на 1 last M1 if $i > 3; # Выход из цикла если $i > 3 ++$i; # иначе увеличиваем счетчик еще раз на 1 } continue { print "$i "; # Печатаем $i } # результат: 2 4 Пример применения оператора redo:
    #!/usr/bin/perl print "Content-Type: text/html\n\n"; 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.


    Оператор S///

    Оператор S///

    s/шаблон/подстрока/egimosx;
    Поиск по шаблону и в случае успеха замена подстрокой. Возвращает количество произведенных подстановок, иначе false (0). Если строка в которой ведется поиск не указана (операторы =~ или != ), то используется переменная $_ . Если в качестве разделителя '/' использовать одинарную кавычку ('), то интерполяции не будет, иначе можно применять переменные в шаблоне или подстроке. Опции:
    e - Рассматривать правую часть как выражение.
    g - Глобальный поиск.
    i - Без различия регистра букв
    m - многострочная переменная
    o - компилировать шаблон один раз
    s - однострочная переменная
    x - расширенное регулярное выражение
    Разделитель '/' можно заменить на любой алфавитно-цифровой символ кроме пробела.
    $var = "12345"; # исходная строка $var =~ s/1/0/; # Заменить '1' на '0'. Результат 02345 $var =~ s(5)(.); # Заменить '5' на '.' Результат 0234. Здесь в качестве разделителя применены скобки, поэтому подстрока взята в две скобки.
    $var =~ s/\d*/каламбур/; #Заменить все цифры. Результат 'каламбур.' $var =~ s/а/о/g; # Заменить все 'а' на 'о'. Результат 'коломбур.' $var = "12 34"; # Новое значение $var =~ s/(\d\d) (\d\d)/$2 $1/; # Поменять местами числа. Результат '34 12'.

    Оператор Split

    Оператор Split

    split (/шаблон/, выражение, предел);
    split (/шаблон/, выражение);
    split (/шаблон/);
    split;

    Разделяет строку, указанную выражением, на массив элементов и возвращает его. В скалярном контексте возвращает количество полученных элементов массива, а сам массив помещает в @_ (в списковом контексте поместить результат в @_ можно если применить ?шаблон?) Если выражение отсутствует, то обрабатывается содержимое переменной $_. Если шаблон отсутствует, то разделителем является пробел. Все, что подходит по шаблону, считается разделителем. Если указан предел, то это максимальное число разделений. Отрицательное значение предела воспринимается как неограниченно большой предел. Если пустая строка походит под шаблон разделителя, то исходное значение разделяется посимвольно. Предел удобно использовать для частичного разделения строки.
    ($a, $b, $остаток) = split(/ /, "Один Два Три Четыре",3); # $a = 'Один', $b = 'Два' и $остаток = 'Три Четыре' Если шаблон содержит круглые скобки, то символы-разделители, указанные в них, вставляются в результирующий список как обычные элементы, причем вставляется символ, который совпал с разделителем
    @a = split(/([,.])/, "Один,Два.Три"); # @a = ("Один", "," ,"Два", ".", "Три") И еще один примерчик:
    @a = split(//,"червь"); # @a = ('ч','е','р','в','ь')

    * * * *
    Попробуйте создать так называемую "плоскую базу": напишите скрипт, который записывает в файл строчки такого вида: "переданная_строка1 & переданная_строка2 & переданная_строка3", при каждом обращении к скрипту. И выводящий на экран самую длинную строку из первых значений и саму короткую из вторых. Эти строки должны сопровождаться значениями из 3-их строк.


    Операторы tr/// и y///

    Операторы tr/// и y///

    tr/таблица1/таблица2/cds;
    y/таблица1/таблица2/cds;

    Замена всех символов из "таблица1" на соответствующий символ из "таблица2". Результат - количество замен или стирании. Без оператора =~ или != операция выполняется со строкой $_. Для совместимости с программой sed вместо tr можно писать 'y'.
    Опции:
    c - дополнение "таблица1"
    d - стереть найденные, но не замененные символы.
    s - "сжать" повторяющиеся замененные символы.
    Если указана опция /d таблица2 всегда интерпретируется как положено. Другими словами, если таблица2 короче, чем таблица1, то символ из таблицы1 интерпретируется всегда. Если таблица2 - null, то все символы строки остаются неизменными. Это удобно для подсчета количества символов в строке определенного класса или для сжатия повторяющихся символов, например, пробелов.
    $s = "hello"; # Исходная строка $s =~ tr/a-z/A-Z/; # Заменить малые буквы на большие. Результат # 'HELLO' $s = 'Hel....lo'; $s =~ tr/a-zA-z/_/c; # Заменить все не буквы на '_' # Результат 'Hel____lo' $s =~ tr/_/ /s; # Заменить '_' на ' ' и сжать. # Результат 'Hel lo' $s =~ tr/a-zA-Z /a-zA-Z/d; # Удалить все не буквы. Результат 'Hel

    * * * *
    Попробуйте написать функцию, которая запрашивает выражение и число. Функция должна возвращать номера слов в выражении, длина которых превышает переданное число.
    Дополнительная информация: [регулярные выражения]


    Открытие и закрытие дескриптора файла

    Открытие и закрытие дескриптора файла

    open (FileVar, FileName);
    close (FileVar);

    Функция Open открывает указанный файл и ассоциирует с ним файловую переменную (дескриптор файла). В зависимости от спецсимвола, стоящего перед именем файла, файл можно открыть с разным способом доступа к нему.
    open (FV,"FN"); Файл открыт для чтения. Запись в него запрещена.
    open (FV,">FN"); Файл открыт для записи. Когда файл открыт таким способом, его содержимое автоматически стирается (а если файл не существует - создается) и в файл можно добавлять данные.
    open (FV,">>FN"); Файл открыт для записи в конец. При таком способе открытия файла, тело файла не изменяется и разрешено добавлять строки в его конец.
    open (FV,"+ Файл открыт для чтения и записи.
    open (FV,"|FN"); Направить информацию на вход программы.
    open (FV,"FN|"); Считать информацию с выхода программы.
    open (FV,"|FN|"); И то и другое.

    Из файла можно считать данные в виде массива и построчно. При считывании файла построчно, какой-то переменной, при первом считывании, присваивается первая строка файла и указатель перемещается на следующую строку. Такое присваивание возвращает True. При втором считывании присваивается вторая строка, при третьем - третья и т.д. до конца файла. Когда указатель дойдет до последней строки, счетчик сбрасывается, указатель перемещается на первую строчку файла, а возвращаемое выражение становится равным False
    При считывании файла в массив, каждая строка файла помещается в отдельную ячейку массива. Плюсы и минусы этих методов очевидны: При считывании файла построчно, экономится память сервера, но работать с файлом становится неудобно, да и этот метод не очень производителен. Другое дело - работа с массивом: это быстро, это удобно, но есть очевидный минус - сильная загрузка памяти сервера. Но несмотря на это, данный метод пользуется огромной популярностью при написании небольших скриптов.
    Чтобы считать файл/строку в какую-то переменную, этой переменной присваивают дескриптор файла, заключенный в треугольные скобки:
    @array = ; $Var = ; Чтобы закрыть файл, используют функцию Close. Хотя её использование не обязательно, т.к. файл закроется сам после окончания выполнения скрипта, но желательно и является признаком хорошего стиля программирования.

    Переключатель

    Переключатель

    Переключатель должен иметь имя и значение. Имя задается в параметре "Name", значение в "value" (в отличие от кнопок, где value - надпись на кнопке). В том случае, если переключатель выбран, передается его имя и значение. Если не выбран - ничего не передается. Если необходимо чтобы переключатель был по умолчанию отмечен, он должен иметь атрибут "checked".



    Почтовые рассылки

    Почтовые рассылки

    чтобы средствами Perl можно было отсылать почту, необходимо чтобы на сервере была установленна программа "sendmail". Версию под Windows пожно скачать из раздела "Download".
    что делаем. Открываем функцией Open программу, и ей на вход подаем нашу почтовую форму:
    open (MAIL,"|/usr/lib/sendmail -t"); print MAIL "To: to\@e.mail\n"; print MAIL "From: from\@e.mail\n"; print MAIL "Subject: Subject\n\n"; print MAIL "Body\n"; close MAIL; Как и HTTP запрос, Email запрос состоит из заголовка и тела. Разберем подробнее заголовок:
    To: - Email адрес получателя письма;
    From: - Email адрес отправителя;
    Subject: - тема.
    Как и в HTTP запросе, тело от заголока отделяется пустой строкой.
    А Вот форма более продвинутого содержания:
    print В общем, почти то же самое, только информации передается побольше и добавлено поле Cc - адресат скрытой копии.
    Еще один интересный код, дает возможность передавать вложенные файлы:
    $to = '"Your Name" '; $recip = 'yourname@yourdomain.com'; $from = '"Your Name" '; $subject = "This is the subject"; $mainbody = "This is the main body\n"; $attachment = "This is an attachment\n"; $message = MakeMessage($to, $from, $subject, $mainbody, $attachment); open (MAIL, "|sendmail -t"); print MAIL $message; close (MAIL); sub MakeMessage { # make a composite message containing a main body and one attachment my ($to, $from, $subject, $mainbody, $attachment) = @_; my $message =

    Поле для ввода пароля

    Поле для ввода пароля

    Для этих полей справедливы вышеизложенные утверждения. Создается это поле тегом со значением "pa" пара" параметра "type".




    Получение данных методом GET

    Получение данных методом GET

    Суть метода GET заключается в передаче некоторого объема информации вместе с URL скрипта. Для отделения URL от передаваемой информации используют знак "?" (вопросительный знак). Неплохо бы чисто формально напомнить, что все пробелы заменяются в URL на знак '+', а все специальные и непечатные символы на последовательность %hh ,где hh-шестнадцатиричный код символа. Методом GET можно одновременно передавать несколько значений. Как это делается я расскажу вам позже, а пока будем довольствоваться одним передаваемым значением.

    * * * *
    Напишем программу, которая выводит квадрат числа, если передаем ей число, или строку, если передаем текстовую строку. Передавать данные следует примерно так: "http://.../cgi-bin/script.pl?256"
    #!/usr/bin/perl
    print "Content-Type: text/html\n\n";

    if ($ENV{'QUERY_STRING'}**2 == 0){print $ENV{'QUERY_STRING'}}
    else{print $ENV{'QUERY_STRING'}**2}
    И еще одна программка, выводящая некоторые сведения о Вашем сервере:
    #!/usr/bin/perl #programm 9 print "Content-Type: text/html\n\n"; @array=($ENV{'SERVER_SOFTWARE'},$ENV{'SERVER_NAME'}); @array=(@array,$ENV{'SCRIPT_FILENAME'},$ENV{'HTTP_USER_AGENT'}); print "

    "; foreach (@array){ print "\n"; } print "
    $_
    "

    * * * *
    Попробуйте написать программу, выводящую таблицу Пифагора с максимальным значением по оси X и Y, передаваемым методом GET.
    Сделайте так, чтобы ячейки закрашивались в шахматном порядке, а оси имели черный цвет.
    Напишите программу, которая выводит символьную строку, переданную скрипту только в том случае, если IP удаленной машины не соответствует 127.0.0.1 .


    Правила хорошего тона при разработке CGI программ

    Правила хорошего тона при разработке CGI программ

    Для начала я расскажу Вам о существовании функции USE.

    Прежде чем приступить к занятиям ...

    Прежде чем приступить к занятиям...

    Прежде чем Вы перейдете к первому уроку, Вы должны немного знать о том как вообще работает Web-сервер и как будут работать Ваши CGI-скрипты (а именно так мы будем называть программы написанные на Perl) на нем. Также Вам потребуется определенное программное обеспечение.
    И так, давайте определимся с терминологией.
    сервер -компьютер, некоторые ресурсы которого доступны другим компьютерам.
    WEB-сервер -компьютер означенный специальным П/О, по средствам которого он способен отдавать HTML документы и результаты работы серверных сценариев другим компьютерам.
    В нашем случае серверные сценарии мы будем писать на языке Perl.
    Существует такой протокол как HTTP, по средствам которого Web-сервер может получать запросы от браузера и отвечать ему. Когда Вы пытаетесь открыть какую-то страницу, браузер посылает на сервер HTTP запрос, в котором содержится информация о том, что хочет от сервера браузер, данные какого формата он может принять и др. Взамен сервер отсылает браузеру HTTP ответ, состоящий из HTTP заголовка и тела. В HTTP заголовке содержаться сведения о формате передаваемых данных, в теле непосредственно данные (к примеру html файл). По мере изучения курса Вы будете всё больше и больше узнавать о передаваемых данных в заголовках HTTP.
    Если сервер получил запрос файла с серверным сценарием, он передаст его соответствующему обработчику, а результат передаст браузеру в теле HTTP.
    Значит, чтобы Вы могли запускать perl-скрипты у себя дома (а без этого у Вас просто не получится изучать Perl), Вам потребуется интерпретатор Perl и программа-сервер, которая сможет с ним работать.
    Так уж завелось, что большая честь Интернет серверов оснащена программами Apache и работают на платформе Unix, а большая часть пользователей работают на платформе Windows и вообще не имеют программ-серверов. Главная наша задача - максимально приблизиться к условиям настоящих Интернет серверов, от этого зависит качество обучения и в конечном счете качество Ваших Perl-скриптов.
    Можно было бы, конечно, установить себе Unix, и работать на "настоящем" web-сервере, но делать это едва ли кто захочет. По этому ограничимся ОС Windows NT. Пойдет всё: NT4/2000/XP. Но если у Вас нет возможности ставить себе такую "роскошь", пойдет и Windows98, только некоторые функции Perl вы не сможете использовать.
    Программу-сервер, как Вы уже догадались, я рекомендую Apache. Скачать его можно из раздела "Download-perl". Настройка Apache весьма сложна и требует немало времени и терпения, но результат того стоит! В том же разделе лежит другой HTTP сервер, называющейся SHTTPS (Small HTTP Server). Его главное отличие от Apache - простота настройки. В принципе, сразу после инсталляции он уже готов к работе, нужно только прописать путь к Perl, чтобы он мог выполнять Perl-скрипты.
    Дистрибутив Perl я рекомендую качать полный (8 Мб), иначе очень навороченные скрипты (по большей части форумы), которые вы скорее всего будете отлаживать у себя на машине, не смогут работать. Но для изучения Perl пойдет и минимальный дистрибутив (600 Кб).
    И так, если у Вас сервер Apache с полным дистрибутивом Perl установлены на Windows 2000, Вы в полной мере сможете ощутить ВСЮ мощ CGI-программинга!
    Напротив, если вы установите SHTTPS с минимальным дистрибутивом Perl под Windows 95, Этого едва ли хватит для первоначального знакомства с Perl.
    Если Вы уже установили сервер и Perl, можете приступать к первому уроку. Если еще нет, раздел "Help" поможет Вам установить и настроить сервера.
    Желаю удачи!
    Дополнительная информация: [подробнее об HTTP протоколе]


    A Форматы MIME Работа

    Приложение A.
    Форматы MIME. Работа с почтой.
    Дополнительные поля HTTP заголовка; работа с Cookie

    Простые поля для ввода

    Простые поля для ввода

    Простое поле для ввода создается тегом , но в отличае от кнопок, значение атрибута "type" должно быть "text". У простого поле для ввода есть дополнительные параметры и атрибуты:
    name идентификатор данного поля
    size длина поля в символах
    title текст всплывающей подсказки
    value значение поля по умолчанию
    maxlength максимально возможное количество вводимых символов
    disabled этот атрибут не дает изменить значение по умолчанию

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



    Прототипы

    Прототипы

    Для краткого описания типа передаваемых подпрограмме параметров можно применять прототипы. Если формат передаваемых данных не будет удовлетворять шаблону прототипа, это вызовет ошибку программы. В Perl существуют следующие прототипы:
    Декларация Пример вызова
    sub mylink($$) mylink $old, $new
    sub myvec($$$) myvec $var, $offset, 1
    sub myindex($$;$) myindex &getstring, "substr"
    sub myreverse(@) myreverse $a, $b, $c
    sub myjoin($@) myjoin ":",$a,$b,$c
    sub mypop(\@) mypop @array
    sub mysplice(\@$$@) mysplice @array, @array, 0, @pushme
    sub mykeys(\%) mykeys %{$hashref}
    sub myopen(*;$) myopen HANDLE, $name
    sub mypipe(**) mypipe READHANDLE, WRITEHANDLE
    sub mygrep(&@) mygrep { /foo/ } $a, $b, $c
    sub myrand($) myrand 42
    sub mytime() mytime
    Здесь:
  • \'символ' - параметр с типом 'символ'
  • '@' или '%' - все оставшиеся параметры как список
  • '$' - скаляр
  • '&' - безымянная подпрограмма
  • '*' - ссылка на таблицу имен
  • ';' - разграничитель обязательных и не обязательных параметров.
  • Вставить часть CGI кода в программу, подобно SSI, можно с помощью функции "require". Её синтаксис прост до безобразия:
    require "файл";
    Пример кода, где подпрограмма загружается из внешнего файла:
    # Файл sub.pl sub summ($$){ return ($_[0]+$_[1]) } # Файл со скриптом require "sub.pl"; print summ(5,2);

    * * * *
    Напишем функцию, которая возвращает фактореал переданного ей числа.
    sub fact{ # объявляем функцию fact my($sum,$i); # объявляем локальные переменные $sum=1; for ($i=1;$i<=$_[0];$i++){ $sum*=$i; } return $sum # возвращаем значение переменной $sum } Примеры вызова такой функции:
    print fact(4);
    print fact(4,22.8,5);
    Результатом выполнения этого кода будет 24 Чтобы избежать вызова функции с ошибочными значениями, используем прототип $, означающий, что функции мы передаем только один парамер:
    sub fact($){ my($sum,$i); $sum=1; for ($i=1;$i Перепишем программу 13 с учетом полученных знаний:
    #!/usr/bin/perl # programm 17 print "Content-type: text/html\n\n"; &parse_form; sub wiev(){ open(file,"file.txt"); @array=; close file; foreach $i(@array){ $u++; print "$u. $i
    "; }} print

    Добавить запись
    Удалить запись номер:
    END ; if ($FORM{'action'} eq "add") { open(file,">>file.txt"); print file "$FORM{'string'}\n"; close file; wiev; } elsif ($FORM{'action'} eq "del") { open(file,"file.txt"); @array=; close file; open(file,">file.txt"); $size=@array; for($i=0;$i wiev } else{wiev} Не правда ли, ощутимая разница?

    * * * *

  • В какую переменную поместится 2-й переданный процедуре параметр?
  • Сколько параметров может принять эта процедура - sub overlay(@); ?
  • Перепишите 3-4 написанные Вами программы с целью ввести туда процедуры.


    Путь к файлу

    Путь к файлу

    Если опустить путь к файлу, а указать только его имя, будет считаться, что указанный файл лежит в той же директории, что и файл скрипта. Допускается указывать как абсолютный, так и относительный путь. К примеру, имеем такое дерево файлов и каталогов:
    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 А относительно файла script.pl, пути будут такими:
    MYDIR/file0.txt file1.txt ../HTDOCS/file2.txt При написании CGI программ принято использовать относительные пути, т.к. владельцы WEB-серверов часто скрывают абсолютное расположение своих директорий.

    Работа с Cookie

    Работа с Cookie

    (отрывок из статьи "Что такое Cookies и с чем их едят")
    Что такое cookie?

    Cookie является решением одной из наследственных проблем HTTP спецификации. Эта проблема заключается в непостоянстве соединения между клиентом и сервером, как при FTP или Telnet сессии, т.е. для каждого документа (или файла) при передаче по HTTP протоколу посылается отдельный запрос. Включение cookie в HTTP протокол дало частичное решение этой проблемы.

    Cookie это небольшая порция информации, которую сервер передает клиенту. Клиент (броузер) будет хранить эту информацию и передавать ее серверу с каждым запросом как часть HTTP заголовка. Некоторые cookie хранятся только в течение одной сессии, они удаляются после закрытия броузера. Другие, установленные на некоторый период времени, записываются в файл. Обычно этот файл называется 'cookie.txt'.

    Что можно делать с помощью cookie?

    Сами по себе cookies не могут делать ничего, это только лишь некоторая информация. Однако, сервер может на содержащуюся в cookies информацию. Например, в случае авторизованного доступа к чему либо через WWW, в cookies сохраняется login и password в течение сессии, что позволяет не вводить их при запросе каждого запаролированного документа. Другой пример: cookies могут использоваться для построения персонализированных страниц. Чаще всего встречается такое - на некотором сервере Вас просят ввести свое имя, и каждый раз, когда Вы заходите на первую страницу этого сервера, Вам пишут что-то типа "Hello, your_name!". На использовании cookies также часто строят функцию оформления заказа в онлайновых магазинах, в частности, в Амазоне, такая своеобразная виртуальная корзина покупателя, как в обычном реальном супермаркете.
    У Cookies есть 2 основных параметра: содержание и время жизни, по истечении которого Cookies не передаются серверу. Чтобы с помощью CGI установить Cookies, нужно добавить в HTTP заголовок строку такого вида:
    Set-Cookie: key=value; expires=date; [key=value] - тело;
    [date] -время жизни.
    Время жизни представляет собой критическую дату, после которой Cookies считается не действительным. Она указывается весьма своеобразным способом:
    Set-Cookie: Name=CowBoy; expires=Fri, 31-Dec-02 23:59:59 GMT; Это значит, что Cookies будут жить только до 31 декабря 2002 года.
    Один документ может содержать несколько Cookies. Код ниже формирует HTTP заголовок с установкой Cookies:
    print "Content-Type: text/html\n"; print "Status: 200 Ok\n"; print "Set-Cookie: name=Robert; expires=Sat, 26-Aug-03 15:45:30 GMT;\n"; print "Set-Cookie: nick=Pauls; expires=Sat, 26-Aug-03 15:45:30 GMT;\n\n"; Чтобы автоматизировать процесс выставления Cookies, написана процедура set_cookie. Она принимает 3 параметра: время жизни в часах, ключ, значение.
    sub set_cookie($$$){ my($year,$date,@day,$ret,$time); $time=time+($_[0]*3600); $year=(localtime($time))[5]; $date=localtime($time); @day=split(/ /,$date); $year =~ s/\d*(\d\d)/$1/; $ret="Set-Cookie: $_[1]=$_[2]; expires="; $ret.="$day[0], $day[2]-$day[1]-$year $day[3] GMT;"; return $ret } Посмотрите как просто с помощью неё устанавливать Cookies:
    print set_cookie(10,"name","Robert"),"\n"; print set_cookie(10,"nick","Pauls"),"\n\n"; sub set_cookie($$$){ my($year,$date,@day,$ret,$time); $time=time+($_[0]*3600); $year=(localtime($time))[5]; $date=localtime($time); $date =~ s/ +/ /g; @day=split(/ /,$date); $year =~ s/\d*(\d\d)/$1/; $ret="Set-Cookie: $_[1]=$_[2]; expires="; $ret.="$day[0], $day[2]-$day[1]-$year $day[3] GMT;"; return $ret } Чтение ранее записанных значений Cookies производится из переменной окружения $ENV{'HTTP_COOKIE'}. Для удобства получения данных написана процедура get_cookie.
    sub get_cookie{ my (@coo_pairs,$pair,$name,$value); @coo_pairs = split(/; /, $ENV{'HTTP_COOKIE'}); foreach $pair (@coo_pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $COOKIE{$name} = $value;} } Она создает хеш %COOKIE, в котором данные представлены в виде ключ-значения.
    В Cookies можно хранить только символы латинского алфавита, символы нижнего подчеркивания, цифры и знаки % (процент). Обычно такого набора символов хватает для хранения служебной информации.
    Чтобы в Cookies можно было хранить все символы таблицы ASCII, доработаем функции передачи следующим образом: будем передавать не сам символ, а его номер в таблице. Для разделения символов будем использовать символ "%". Анологичным образом поступим с функцией приема Cookies, только она будет дешифрировать наши последовательности.
    Скрипт ниже создает и считывает значения из Cookies. Все функции модифицированны:
    #!/usr/bin/perl print "Content-Type: text/html\n"; print &set_cookie(1,"name","Robert"),"\n"; print &set_cookie(1,"nick","Pauls"),"\n\n"; my ($COOKIE); sub set_cookie($$$){ my($year,$date,@day,$ret,$time,$word); $time=time+($_[0]*3600); $year=(localtime($time))[5]; $date=localtime($time); $date =~ s/ +/ /g; @day=split(/ /,$date); $year =~ s/\d*(\d\d)/$1/; $word=$_[2]; $word =~ s/(.)/"%".ord($1)/eg; $ret="Set-Cookie: $_[1]=$word; expires="; $ret.="$day[0], $day[2]-$day[1]-$year $day[3] GMT;"; return $ret } sub get_cookie{ my (@coo_pairs,$pair,$name,$value); @coo_pairs = split(/; /, $ENV{'HTTP_COOKIE'}); foreach $pair (@coo_pairs) { ($name, $value) = split(/=/, $pair); $value =~ s/%(\d+)/chr($1)/eg; $COOKIE{$name} = $value;} } get_cookie; print $COOKIE{'name'},"
    "; print $COOKIE{'nick'};

    Радиокнопка

    Радио-кнопка

    В отличие от checkbox, может быть несколько радио кнопок с одинаковым параметром name ,но с разными value, из них передается только та, что выбрана. Одна из них может быть изначально выбрана по умолчанию.




    Скрытое поле

    Скрытое поле

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



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

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

    [урок 1] Создание и запуск Perl-скриптов, оператор Print.
    [урок 2] Типы данных в Perl, переменные, одинарные и двойные кавычки.
    [урок 3] Операции с числами и строками, логические выражения.
    [урок 4] Составной и условный операторы.
    [урок 5] Операторы повторения с заданным количеством итераций.
    [урок 6] Операторы повторения с неизвестным заранее количеством итераций.
    [урок 7] Метки, оператор перехода, операторы управления циклами.
    [урок 8] Список. Массив. Работа с массивом.
    [урок 9] Метасимволы.
    [урок 10] Встроенные переменные, получение данных методом GET.
    [урок 11] HTML формы, функция ParseForm, метод POST.
    [урок 12] Оператор Print, хеши.
    [урок 13] Функции работы с файлами.
    [урок 14] Функции для работы с файлами (продолжение).
    [урок 15] Функции для работы с файлами (продолжение).
    [урок 16] коротко о SSI.
    [урок 17] Подпрограммы, прототипы.
    [урок 18] Работа с числами.
    [урок 19] Функции для работы со строками.
    [урок 20] Операторы для работы со строками (продолжение).
    [урок 21] Регулярные выражения.
    [урок 22] Операторы поиска и замены.
    [урок 23] Еще немного о циклах.
    [урок 24] Функции для работы с массивами.
    [урок 25] Функции для работы с хешами.
    [урок 26] Дата и время.
    [урок 27] Функции для работы с директориями.
    [урок 28] Прочие функции.
    [приложение A] Форматы MIME. Работа с почтой. Дополнительные поля HTTP заголовка; работа с Cookie.
    [приложение Б] Возможные ответы на задания для самостоятельного выполнения.
    [приложение В] Примеры скриптов, выполненных на языке Perl


    Создание серверных приложений на языке PERL
    Ускоренный учебный курс
    Off-line plus версия

    Автор: Cleric ICN
    Дата последнего изменения: 04.12.02 18:21
    Это учебное пособие написано для того чтобы помочь Вам самостоятельно изучить язык Perl и представляет собой своего рода выжимку из многих электронных и бумажных изданий подобного рода. Пройдя его Вы изучите все необходимые для разработки собственных приложений операторы и функции, узнаете об их специфических особенностях. В рамках этого курса мы будем рассматривать Perl только как язык написания CGI-сценариев.
    Чтобы ускоренное изучение Perl не вызывало у Вас никаких затруднений, Вы должны обладать определенным набором знаний в области создания HTML документов. Вы должны хорошо знать HTML тэги, работать с таблицами и каскадными таблицами стилей (CSS). Помимо этого вы должны иметь хотя бы начальные знания в области языков программирования высокого уровня (Pascal, Basic, Delphi, C, JavaScript и т.д.). А если Вы уже знаете PHP, то получите ни с чем не сравнимое удовольствие от изучения Perl по ускоренному курсу.
    И так, с чем же Вы будете иметь дело?! Весь курс разбит на 28 уроков, пройдя которые Вы изучите 114 операторов и встроенных функций.
    В свою очередь каждый урок разбит на 3 части:
    1-я часть - теоретическая. В ней будет даваться теоретический материал по теме урока.
    2-я часть - практическая. В ней будет дан пример CGI-приложения выполненного с применением знаний, полученных в этом и предыдущих уроках.
    3-я часть - задания для самостоятельного выполнения. В конце каждого урока я буду давать Вам несколько "домашних заданий" для закрепления полученных знаний.
    Психологами установлено, что учеба проходит гораздо быстрее, эффективнее и интереснее, если есть какая-то видимая конечная цель (стимул), к которой нужно стремиться. Полное изучение Pelrl не может быть в данном случает стимулом, т.к. знания не вещественны. Стимулом этого курса будет создание скрипта гостевой книги.
    В период изучения Perl у вас могут возникать вопросы по некоторым темам, это характерно для любого человека. Важно быстро получить качественный ответ. Сделать это не всегда просто, ведь Вы часто не имеете возможность задать свой вопрос знающему человеку. Чтобы попробовать самостоятельно разобраться со своим вопросом, в разделе "Help" выложены 2 полных справочника по "чистому" Perl и "Учебное пособие по CGI-программированию от Леши", которое будет являться памяткой для Вас. И помните, Вы ВСЕГДА можете обратится со своими вопросами к автору курса по E-mail.
    Если у Вас Всё готово, можете переходить к организационному разделу.



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



    Список

    Список

    Задает список, позволяющий выбрать одну (или несколько) опций из списка. Его значение всегда передается, т.к. всегда хотя бы одно выбрано.
    Список создается тегом