WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




Обсуждаем модуль 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, что справедливо для любого модуля.

Автор: Жорж Пращарук


 :::::  Александр пишет 05.02.2001 @ 10:03 
У меня вопрос простой. Чем оличаются файлы .pl от .cgi и почему одни используют одно, а другие и то, и другое?
 :::::  Вадим Хомаха пишет 06.02.2001 @ 00:16 
Для тех, кто не читает по-английски - русский вариант документации на CGI.pm в формате pdf на сайте http://perldoc.narod.ru
 :::::  Alex пишет 08.02.2001 @ 06:51 
Помимо всех перечисленных приемуществ CGI.pm позволяет неплохо работать с cookie s. Не надо изобретать велосипед надо внимательней изучать документацию
 :::::  Anonymous пишет 28.02.2001 @ 23:18 
Честно говоря, не разделяю вашего восторга по поводу CGI.pm по многим причинам.
Во-первых, парсинг HTTP-запросов - достаточно простая задача, не требующая от программиста написания десятков Кб Perl-кода. Во-вторых,
модуль не обрабатывает правильно некоторые вполне корректные HTTP-запросы. К примеру, "смешанные":
Content-type: multipart/*, а имена файловых параметров повторяются и совпадают с именами остальных. В-третьих, функции генерации HTML-кода, которыми дополнен CGI.pm, совершенно не к месту, с тем же успехом можно было бы дописать функции генерации изображений GIF, PNG или JPEG.
Вообщем, рекомендовано мистером Эль. Штейном для использования в начальной и средней школе.

 :::::  hellman пишет 23.11.2001 @ 06:02 
Все конечно хорошо, но почему то многие люди используют CGI.pm, например, для создания форм,подписыванию куков и т.д.
А вы не задумывались что =~ 150Kb кода это многовато?

Лишние ресурсы....
 :::::  rr пишет 22.10.2004 @ 17:44 
Давненько тут никто не отмечался 8)
А если серьезно ето один из самых важных момен в системе безопасности 8)
И было бы совсем хорошо если бы автор все таки довел статью до логического завершения (где как ни здесь ето сделать)
 :::::  альфа пишет 11.07.2006 @ 00:44 
@ hellman

perldoc на тему use.. можеш кишки експортера глянуть - тоже полезно (если конечно это твой уровень)

и ещё.... помни, не количество кода играет роль, а время исполнения.
Имя:
Email:
URL

Введите сумму двух чисел девять и одинн (девять+одинн=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0137918