Обсуждаем модуль CGI для Perl


Прислал: Жорж Пращарук [ 05.02.2001 @ 04:28 ]
Раздел:: [ Статьи по Perl ]


На мой взгляд, модуль CGI наилучший, в смысле простой, вариант для декодирования данных из форм HTML страниц. Этот модуль позволяет делать еще некоторые вещи, например генерировать HTML страницы, но это тема для другой статьи.

Начнем с того, что этот модуль позволяет использовать 2 стиля программирования: функционально-ориентированный и объектно-ориентированном. Имеет смысл рассмотреть второй метод, т.к.: гораздо удобнее программировать, можно создать несколько объектов в программе (области данных этих объектов не пересекаются), а также можно сохранить текущее состояние объекта во внешнем файле или напримерв БД, хотя последнее не относится к стилю программирования.

Теперь об этом по порядку. Как правило, скрипты используются для обработки данных форм. Хотя, врочем, это не важно. В 99% случаев необходимо получить значения передаваемых скрипту параметров. Параметры могу передавать 2 способами (методами) POST или GET. Не принципиально каким способом передавать параметр скрипту. Единственное ограничение которое имеется, это количество (объем в кб) параметров передаваемых тем или иным способом. Для метода GET - 2кб, для POST - ограничения нет (в протоколе CGI, если я не прав - поправьте меня).

Для подключения модуля в программу достаточно просто написать:
use CGI;
Для создания объекта нужно использовать метод new:
$query=new CGI; - создали объект с помощью метода new. У этого метода существует несколько различных вариантов
$query=new CGI(INPUTFILE); - создаем объект и инициализируем его из файла. Передаем дескриптор файла!
$query = new CGI(*STDIN); - инициализация из STDIN
$query = new CGI( {'dinosaur'=>'barney',
'song'=>'I love you',
'friends'=>[qw/Jessica George Nancy/]}
); - можно передать массив имен параметров и их значений
$query = new CGI('dinosaur=barney&color=purple'); - или строкой
$query=new CGI($old_query); - или используя имеющийся объект

Под инициализацией следует понимать передачу строки вида: name1=value1&name2=value2&name3=value3 и т.д. (Кроме инициализации из файла. Об этом ниже.) Где name1, name2, name3 и т.д. имена параметров, а value1, value2, value3 соответственно их значения.

Но нас интересует самый простой метод $query=new CGI; - объект "сам" разбирается каким методом POST или GET мы передаем параметры, а если мы запустили программу из shell'a, то строку берет из STDIN. После создания объекта нам необходимо получить значения параметров (в большинстве случаев мы знаем имена параметров, т.к. сами их задаем).

Это делается так:
$value1 = $query->param('name1'); - в переменную $value1 передаем значение параметра "name1" вот собственно, декодирование форм. Довольно просто. Две строки!

Если мы незнаем имена параметров, то их можно узнать так:
@names = $query->param
теперь в @names мы имеем список имен параметров.

Когда параметров много довольно неудобно каждый раз писать, что-то типа:
$value1 = $query->param('name1');

Проще сделать так:
$query->import_names('R');
мы импортируем все параметры и их значения в пространство имен 'R'. (Perl разрешает много пространств имен)
Доступ осуществляется так:
к значению параметра name1: $R::name1.
Если методу не передать ни какого параметра, то поумолчанию создается пространство имен 'Q'.

Сохранение состояния скрипта в файл:
Для этого используется метод save(FILEHANDLE) которому передается дискриптор файла.
Формат файла имеет вид:
NAME1=VALUE1
NAME2=VALUE2
NAME3=VALUE3
=

Восстановление состояния скрипта из файла: для этого, при создании объекта в методе new параметром передаем дескриптор файла состояния. Это описано выше.

В этой статье я не коснулся таких вещей, как множество значений одного параметра. Как получать их значения возможно я напишу в следующей статье. А тому кто не может ждать я рекомендую почитать официальную документацию на модуль CGI.pm.
Самый простой способ ее получить такой:
введите в shell такую команду: pod2html /path/to/perl/modules/CGI.pm > ~/CGI.html, что справедливо для любого модуля.

Автор: Жорж Пращарук( mailto:chidar@mail.ru )