Модуль cgi pm


Модуль cgi pm

Перевод Анисимова Михаила

Каждый, кто начинает программировать на Перле, сталкивается с аббревиатурой CPAN, что значит Comprehensive Perl Archive Network («всеобъемлющий архив по Перлу») CPAN — прекрасный ресурс, где можно отыскать все что угодно, связанное с Перлом. В мире много зеркал CPAN, так что выбирайте то, которое вам ближе географически. Для этого сходите на ftp://ftp.funet.fi/pub/languages/perl/CPAN/CPAN, где есть список всех зеркал.

Немного об организации архива. Каждое зеркало центрального сервера содержит файл CPAN/Roadmap или CPAN/Roadmap.html, а также CPAN/modules/Readme, где есть описания всех содержащихся модулей. Вы скажете — Зачем нам эти модули? Мы и сами можем написать. Ну если так — то пожалуйста, пишите сами. А те, кто желает сэкономить время и силы, зайдите на CPAN и найдите для себя уже готовый модуль.

Не так давно передо мной стала задача — сделать что-то наподобие news-reader’а прямо на веб-странице. То есть: при обращении к серверу пользователь получает список сообщений в группе новостей (конференции) в виде ссылок на сами сообщения. Щелкнув по ссылки пользователь сможет поглядеть картинку, содержащуюся в сообщении. Доступ к конференции осуществляется по протоколу NNTP.

Мне нужен был CGI, NNTP и base64 для декодирования картинок внутри сообщений. Для обеспечения CGI-интерфейса был взят модуль CGI.pm (CPAN/authors/id/LDS/CGI.pm-2.13.tar.gz). Для того, чтобы общаться с news-сервером по NNTP протоколу я нашел NNTPClient все там же на CPAN — CPAN/authors/id/RVA/NNTPClient-0.22.pm.gz. Ну и последний компонент — base64 декодировщик я нашел в модуле LWP (MIME:Base64) (CPAN/authors/id/LDS/CGI-modules-2.74.tar.gz.)

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

Вот такой скрипт получился в результате:

Скрипт 1

Комментарии:

Строки 3-5: подключение модулей

Строка 7: Адрес news-сервера можно конечно же поменять.

Строки 12-22 определяют массив названий групп, в длинной форме — для сервера и в короткой — для человека. Длинное имя можно получить, например, так — $groups[2][0], а короткое — $groups[2][1]

В строке 24 создается CGI-объект $Q. Входные данные скрипт может получать из командной строки, через переменную окружения и из стандартного потока ввода.

Строка 25 позволяет получитьURL скрипта, который используется в дальнейшем.

В 27 строке проверяется входной параметр ‘group’. И если его нет — то выводится полный список групп. Строки 28-44 создают страничку со списком доступных групп на основе массива @groups 28-29 строки создают переменную $links, содержащую ссылки на группы в виде:

Строки с 32 по 40 выводят результат — заголовок, начало HTML-документа, список ссылок и конец HTML-документа. Конструкция @ <[thing]>— это вывод ‘thing’ в списковом контексте. Можно было вместо этого просто разбить оператор print на несколько операторов print.

Строка 46: проверка на наличие входного параметра article.

Строки с 47 по 65 выводят список сообщений в выбранной группе.

Строка 47: установление соединения с news-сервером (порт 119 — стандартный)

Строки с 48 по 51: вывод тем всех сообщений в данной конференции. Выражение в строке 48 возвращает массив строк, где символом табуляции разделены номер и тема сообщения. 49 строка разбивает строки, а 50тая — создает строку со списком уже в HTML-виде, где на каждое сообщение — своя ссылка:

Строки 52-60: вывод результатов

Строка 69 начинает часть скрипта, которая непосредственно выдает картинки, содержащиеся в отдельных сообщениях. Снова устанавливается соединение с news-сервером, и забирается уже конкретное сообщение.

Строка 71: сообщение укладывается в массив @art

Строка 72: так как важна только та часть сообщения, которая начинается с Content-type, то все остальные строки можно выкинуть. При этом сохраняется тип картинки (строка 73).

Строки 74-75: Пустая строка после Content-type пропускается

Строка 76: непосредственно декодирование из base64

Модуль cgi pm

На этом шаге мы дадим общую характеристику модуля CGI.pm .

Пример, рассмотренный на предыдущих шагах, демонстрирует наивный подход, когда кажется, что все необходимые программы надо писать самостоятельно с самого начала. Но программирование CGI — это такая область, в которой Perl давно и активно применяется, и многое из того, что может потребоваться, уже давно кем-то написано. Надо только найти и использовать. Начиная с этого шага мы сделаем краткий обзор одного из таких готовых средств, предназначенных для поддержки разработки CGI -приложений.

Модуль CGI.pm , созданный Линкольном Штейном , входит в состав дистрибутивного комплекта Perl , начиная с версии 5.004, и его даже не нужно специально инсталлировать.

Этот модуль содержит большой набор функций для создания и обработки HTML -форм. Мы посвятили значительную часть предыдущих шагов изучению многочисленных тэгов, чтобы затем написать HTML -код для создания формы в рассмотренном примере. Модуль CGI позволяет сделать то же самое, но без использования HTML . С его помощью можно описать форму на языке Perl , используя вместо тэгов обращения к функциям модуля. В результате получится не документ HTML , а сценарий на языке Perl , который при вызове будет «на лету» генерировать HTML -форму и передавать серверу для отправки клиенту.

Модуль CGI является не просто модулем, а классом, что позволяет использовать преимущества объектно-ориентированного подхода. Модуль предоставляет пользователю на выбор два вида интерфейса с самим собой: процедурно-ориентированный и объектно-ориентированный .

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

Директива use импортирует в пространство имен вызывающей программы некоторый стандартный набор функций. Помимо него, существуют другие наборы функций модуля CGI . Их можно импортировать, указав имя соответствующего набора в списке импорта директивы use . Имена всех наборов можно просмотреть в файле CGI.pm , где они содержатся в хеш-массиве %EXPORT_TAGS .

Функции header(), start_html(), h1() являются функциями модуля CGI . Они будут рассмотрены в следующих шагах.

При использовании объектно-ориентированного интерфейса в директиве use вызывающей программы не нужно указывать список импортируемых имен функций. В этом случае взаимодействие с модулем CGI осуществляется через объект класса CGI , который нужно создать в вызывающей программе при помощи конструктора new() . Объектно-ориентированный вариант приведенного выше фрагмента выглядит следующим образом:

Замечание . Функции модуля CGI.pm являются методами класса CGI . Для того чтобы их можно было вызывать и как функции, и как методы, синтаксис не требует в качестве обязательного первого параметра указывать объект класса CGI . Поэтому в качестве функций к ним можно обращаться обычным образом, а как к объектам — только используя форму $object->method() .

На следующем шаге мы приведем пример CGI- сценария с использованием данного модуля .

Глава 19: СGІ-программирование.
19.1 Модуль CGI.pm

Начиная с версии 5.004, в состав стандартного дистрибутива Perl включается модуль CGI.pm, который все знает и все умеет*.

Этот модуль, который написал Линкольн Штейн, автор хорошо известной книги How to Setup and Maintain Your Web Site, превращает процедуру создания CGI-программ на Perl в легкую прогулку. Как и сам Perl, CGI.pm является платформо-независимым, поэтому его можно использовать практически с любой ОС, от UNIX и Linux до VMS; он работает даже в таких системах, как Windows и MacOS.

* Если у вас инсталлирована одна из более ранних версии Perl (но как минимум 5.001) и вы еще не собрались переходить на новую, просто получите CGI.pm из CPAN.

Если CGI.pm уже инсталлирован у вас в системо, вы можете прочесть его полную документацию, воспользовавшись любым из способов, которые вы используете для чтения man-страниц Perl, например с помощью команд man(1) или perldoc(l) либо обратившись к HTML-варианту документации. Если ничего не получается, прочтите файл CGI.pm’. документация на модуль встроена в сам модуль, представленими в простом формате pod *.

Разрабатывая CGI-программы, держите зкземпляр man-страницы модуля CGI.pm под рукой. Она не только содержит описание функций этого модуля, но и загружается вместе со всевозможными примерами и советами.

* Pod сокращенно обозначает plain old documentation («обычная старая документация»). Это упрощенная форма представлення, испояьзуемая для всей документации на Perl. Принцип работы этого формата изложен на man-странице perlpod(l), а некоторые pod-трансляторы описаны на man-страницах pod2man(l), pod2html(l) и pod2text(l).

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

Предмет Web-программирования Программирование на стороне клиента и сервера Инструменты и технологии программирования

Использование CGI.pm. Итак, как coздается CGI сценарий? Теоретически это очень просто — программа CGI, как и любая другая программа на Perl, выполняет обычные команды Perl, когда она вызывается броузером (то есть когда броузеру в качестве URL задается CGI-сценарий). Все, что вы направляете в стандартный вывод, передается броузеру. Так, если CGI-сценарий выполняет команду print «Hello!», этот текст будет возвращен броузеру, и на странице появится надпись «Hello'» Но это рудиментарный способ. Требуется ли прочитать данные, введенные пользователем с помощью элементов управления, расположенных на странице? Или вы захотите создать эти элементы управления из сценария? Чтобы сделать все это и многое другое, используется прилагающийся к Perl пакет CGI.pm. (Далее мы рассмотрим другой популярный пакет — cgi-lib.pl.) С одной стороны, это стандартный способ работы с CGI средствами Perl, с другой — отличное введение в CGI.pm.

Итак, интерпретатор Perl содержит, среди других модулей, стандартный модуль CGI.pm. По­этому если у вас установлен Perl, то, скорее всего, есть и CGI.pm. Начиная с пятой версии Perl CGI.pm стал объектно-ориентированным, хотя упрощенный функционально-ориентиро­ванный интерфейс все еще существует. В наших примерах мы будем использовать объектно-ориентированное программирование. Создавая с помощью CGI.pm объекты CGI, мы будем вызывать различные методы этого объекта. Существуют методы, соответствующие практи­чески всем основным тегам HTML, и при их вызове создается нужный тег с указанными ат­рибутами. Все они могут получать именованные параметры (за исключением методов, тре­бующих один аргумент), иными словами, требуется указать не только значение атрибута HTML, но и его имя. В следующем примере объект CGI создает Web-страницу посредством встроенных методов. Обратите внимание на именованные параметры метода textarea, за­дающие имя области редактирования текста (‘textarea’), значение по умолчанию и размеры:

Листинг 5.6. Создание Web- страницы.

print $co->header, $co->start_html(-title=>’CGI Example’),

$co->center($co->H2(‘Welcome to CGI!’)),

-default => ‘No opinion’,

Если возможности объектно-ориентированного интерфейса не требуются, пакет CGI.pm также поддерживает простой функционально-ориентированный интерфейс. Мы рассмотрим пример применения функционально-ориентированного интерфейса CGI.pm ниже.

Создание и использование элементов управления HTML. Изучать программирование лучше всего на примерах. Потому ниже приводятся два CGI-сценария: один создает Web-страницу с элементами управления — полями ввода текста, переключателями, кнопками, включая Submit, а второй читает данные, введенные пользователем на этой странице. Оба сценария — вариации с небольшими дополнениями на тему оператора print, который собственно и создает страницу.

Первый сценарий хранится в файле cgil.pl, и в справочных целях полностью приводится в листинге 6-7. Когда пользователь открывает сценарий в броузере (переходя по его адресу — например, /user/cgi/cgil.pl), сценарий возвращает страницу с элементами управления HTML и текстом. В данном случае это страница анкеты.

Страница содержит приветствие и сообщение о том, что посетители, не желающие заполнять анкету, могут перейти по ссылке на сервер CPAN (Comprehensive Perl Archive Network — всеобъемлющий архив, посвященный языку Perl).

Затем вы увидите запрос имени пользователя с текстовым полем и вопрос о его мнении с областью редактирования текста (многострочное текстовое поле).

Просматривая анкету дальше, вы увидите еще несколько элементов управления — кнопки с зависимой и независимой фиксацией, списки, а также кнопка подтверждения и очистки анкеты. Позже мы рассмотрим, как создать все эти элементы управления на примере предложенных сценариев. Когда пользователь нажимает на кнопку Submit, расположенную в конце анкеты, броузер собирает данные, введенные на странице, и передает их другому CGI-сценарию, cgi2.pl. В справочных целях он приведен в листинге 6-8.

В общем, нет никакой необходимости создавать CGI-сценарий, генерирующий анкету, — можно просто написать страницу HTML, которая будет вызывать cgi2.pl по нажатию пользователем кнопки Submit. Подход, требующий генерации кода, выбран лишь затем, чтобы продемонстрировать обе стороны процесса — как создать элементы управления HTML из CGI-сценария и как прочесть данные из этих элементов управления.

Листинг 5.7. cgi 1 .pl

use CGI; $co = new CGI;

$labels <'1'>= ‘Sunday’; $labels <'2'>= ‘Monday’;

$labels <'3'>= ‘Tuesday’; $labels <'4'>=’Wednesday’;

$labels <'5'>= ‘Thursday’; $labels <'6'>= ‘Friday’;

print $co->header(-charset=>’windows-1251′, -lang=>’ru’),

Илон Маск рекомендует:  Что такое код signal

-title => ‘CGI Example’,

$co->center($co->H2(‘Here is the Survey!’)),

$co->H3(‘Please fill out survey. ‘),

«Reasons for filling out our survey:», $co->p,

$co->ul( $co->li(‘Fame’), $co->li(‘Fortune’), $co->li(‘Fun’ ) ),

«If you would rather not fill out our survey, «,

«you might be interested in «,

«Please enter your name: «, $co->textfield(‘text’), $co->p,

«Please enter your opinion: «, $co->p,

$co->textarea( -name => ‘textarea’,

-default => ‘No opinion’,

$ co->p, «Please indicate what products you use: «, $co->p,

-values => [‘Shampoo’,’Toophpaste’,’Bread’, ‘Cruise missiles’ ],

-defaults => [‘Bread’,’Cruise missiles’] ), $co->p,

«Please indicate your income level: «, $co->p,

$co->scrolling_list(‘list’, [‘Highest’,’High’,’Medium’,’Low’ ], ‘High’), $co->p,

«Please indicate your day of a week: «, $co->p,

-labels => \%labels), $co->p,

«Thank you for filling out our survey. Please indicate «,

«How much unsolicited mail you like to get: «, $co->popup_menu(

-values => [‘Very much’,’A lot’,’Not so much’,’None’] ), $co->p,

$co->center( $co->submit, $co->reset, ),

Листинг 5.8. cgi2.pl

use CGI; $co = new CGI;

print $co->header(-charset=>’windows-1251′, -lang=>’ru’),

-title => ‘CGI Example’,

$co->center($co->H2(‘Thanks for filling out our survey.’)),

$co->H4(‘Here is your responses. ‘), $co->hr;

$co->em($co->param(‘text’)), «.», $co->p, «Your opinions are: «,


«You use these products: » ,

$co->p, «Your income level is:», $co->em($co->param(‘list’)),».»,

$co->p, «Today is day «,

$co->em($co->param(‘radios’)), « of the week.», $co->p,

«How much unsolicited mail you like: «,

«The hidden data is «, $co->em(join(«, «,

print $co->hr; print $co->end_html;

Начинаем HTML- документ. Начало работы над документом HTML строится следующим образом. Вначале вы создаете CGI объект, затем с помощью метода header этого объекта — HTTP-заголовок (в данном примере создается простая шапка документа, но допустимы сколь угодно сложные шапки с любыми атрибутами, например, -charset=>’windows-1251′). Заголовок можно сформировать и самостоятельно, напимер, командой print. Метод start_html начинает сам документ HTML. Этот метод создает секцию , а также позволяет указать некоторые атрибуты , как-то: цвет для изображения фона и ссылок. Ниже приведен фрагмент кода cgil.pl, открывающий страницу. Обратите внимание: чтобы результаты работы методов header и start_html попали на страницу, необходимо использовать функцию print:

-title => ‘CGI Example’ ,

Создаем заголовки HTML. После создания шапки CGI-методы типа H2, H3, H4 и др. помогут создать заголовки, соответствующие тегам , , и т. д. Ниже приведен фраг­мент кода, генерирующий заголовки и в начале Web-страницы с анкетой. В данном случае это простое приглашение пользователю.

$со = new CGI; print

$co->H2(‘Here is the Survey!,’),

$co->H3(‘Please fill out survey. ‘)

Центрируем элементы. Чтобы центрировать текст с помощью тегов , используется CGI-метод center. В следующем примере центрируется заголовок, созданный в предыдущем примере:

$со = new CGI; print

$co->center($co->H2(‘Here is the Survey!’)),

$co->H3(‘Please fill out survey. ‘),

Создаем маркированный список. CGI-методы ul и li создают несортированный маркированный список (теги


    и
    соответственно). Ниже приведен фрагмент кода, представляющий пользователю несколько аргументов, побуждающих заполнить анкету:

$со = new CGI; print «Reasons for filling out our survey:»,

$co->li(‘Fame’), $co->li (‘ Fortune ‘), $co->li(‘Fun’ ), )

Создаем гиперссылку. Гиперссылки помещаются на страницу CGI-методом а, как в примере ниже, где выводится URL для перехода (на случай, если пользователь не заинтересован в заполнении анкеты, созданной сценарием cgil.pl):

$со = new CGI; print

«If you would rather not fill out our survey , «,

«you might be interesed in»,

Создаем горизонтальную полосу. Для создания горизонтальной линии (метка ) используется CGI-метод hr:

$со = new CGI; print

Создаем HTML -форму. Элементы управления HTML группируются в формы. В примере с анкетой для создания формы использовался GGI-метод startform. После нажатия кнопки Submit данные из элементов управления должны быть прочитаны и переданы сценарию, формирующему сводку данных, то есть cgi2.pl. URL этого сценария указывается в атрибуте action формы:

#!/usr/local/bin/perl $со = new CGI; print

Все последующие элементы управления будут включены в форму, потому что метод startform генерирует тег .

Замечание. Если startform вызывается без аргументов, кнопка Submit возвращает введенные данные той же форме. Ниже рассказывается, как использовать такую возможность.

Работаем с текстовыми полями. Для создания текстового поля, позволяющего вводить текст, используется CGI-метод textfleld. В примере ниже создается текстовое поле, предназначен­ное для хранения имени пользователя.

«Please enter your name: ‘ ,

Чтение данных из элементов управления HTML. Элементы управления созданы (точнее, пока только текстовое поле), но как считать из них данные? Когда пользователь нажмет на кнопку Submit, броузер отправит данные формы сценарию cgi2.pl; CGI-метод param в нем как раз и предназначен для чтения данных. Ему достаточно передать имя, присвоенное текстовому полю, в данном случае — ‘text’ (см. предыдущий раздел), а вывод выполняется следующим образом:

print «Your name is: «, $co->em($co->param( ‘text ‘)), «.»;

Метод em создает метку , которая большинством броузеров воспринимается как указание на переход к курсивному начертанию.

Работаем с текстовыми областями. Текстовая область может содержать несколько строк текста. Вот как в cgil.pl создается текстовая область, предназначенная для ввода любого мнения пользователя (задается как описание самой области в 10 строк по 60 символов в каждой, так и некоторого текста по умолчанию, а также имени области, ‘textarea’):

$со = new CGI; print «Please enter your opinion; «, $co->p,

-default => ‘No opinion’,

А во фрагменте ниже, CGI-метод param считывает текст и выводит данные анкеты:

print «Your opinions are: «, $co->em($co->param(‘textarea’)), «.»;

Работаем с кнопками с независимой фиксацией. Кнопки с независимой фиксацией (check­buttons) обычно объединяются в группу, что позволяет возвращать имена выбранных эле­ментов управления в одном списке. Во фрагменте кода, приведенном ниже, с помощью CGI-метода , checkbox_group как раз и создается такая группа. Ей присваивается имя, кноп­ки получают подписи и задаются пункты, выбранные по умолчанию при выводе Web-страницы:

#!/usr/local/bin/perl $со = new CGI; print

«Please indicate what products you use. «,$co->p,

-values => [‘Shampoo’, ‘Toothpaste’ , ‘Bread’, ‘Cruise missiles’],

-defaults => [‘Bread’ , ‘Cruise missiles’ ] )

Код ниже предназначен для проверки и вывода выбора пользователя. В данном случае param возвращает список имен помеченных кнопок, поэтому потребовался вызов функции join, объединяющей элементы списка в строку:

print «You use these products: «, $co->em(join(«, «, $co->param(‘checkboxes’))),

Работаем со списками. Список с готовыми значениями можно прокрутить в случае, когда невозможно одновременно вывести па экран все его строки. Этот элемент управления созда­ется CGI-методом scrolling_list. В сценарии cgil.pl список позволяет выбрать уровень доходов. Он называется ‘list’ и включает строки ‘Highest’, ‘High’, ‘Medium’ и ‘Low’, причем по умолчанию выбрано ‘High’:

$со = new CGI; print «Please indicate your income level: «,$co->p,

[‘Highest’, ‘High’, ‘Medium’, ‘Low’], ‘High’, )

Ниже приведен пример чтения и вывода выбранной строки:

print «Your income level is: «, $co->em($co->param(‘list’)), «.»;

Работаем с кнопками с зависимой фиксацией. Кнопки с зависимой фиксацией (radiobuttons) позволяют сделать однозначный выбор из нескольких значений. Например, в cgil.pl создается семь таких кнопок. Они объединяются в группу ‘radios’ и получают значения от ‘1’ до ‘7’, а метки прикрепляются к ним с помощью хэша %labels:

$labels <'1'>= ‘Sunday’; $labels <'2'>= ‘Monday’:

$labels <'3'>= ‘Tuesday’; $labels <'4'>= ‘Wednesday’;

$labels <'5' >= ‘Thursday’, $labels <'6'>= ‘Friday’;

print «Please indicate your day of a week: «, $co->p,

Ниже приведен пример чтения и печати выбранного элемента, взятый из сценария cgi2.pl:

print «Today is day ‘, co->param(‘radios’), » of the week.»;

Работаем с раскрывающимся списком. В HTML раскрывающийся список представляет собой набор элементов, который пользователь может открыть нажатием кнопки, обычно сопровождающийся изображением стрелки вниз. Пользователь может выбрать элемент списка, а вы — определить, на чем он остановился. Вот как делается выбор количества непрошеной почты, которое пользователь согласен получать (пример взят из нашей анкеты). Элементы задаются при помощи метода popup_menu:

$со = new CGI; print

-values => [‘Very much’, ‘A lot’,’Not so much’ , ‘None’ ] )

Далее приведен пример чтения и печати выбора пользователя, взятый из сценария cgi2.pl:

print «How much unsolicited mail you like»,

Работаем со скрытыми полями данных. Данные, хранящиеся в скрытом поле на Web-странице, невидимы для пользователя. (Это удобно, когда сценарий ожидает получить некоторые неизменные сведения о странице.) Такие поля создаются следующим образом:

$со = new CGI; print

И вот как вывести эти данные из cgi2.pl:

print «The hidden data is: «,

Создаем кнопки отмены и подтверждения. Чтобы отправить на сервер данные формы, пользователь должен нажать кнопку Submit. Она создается CGI-методом submit. Аналогично, кнопка Reset, которая очищает данные формы, создается методом reset. Ниже приведен пример кода, создающий кнопки Submit и Reset на Web-странице:

$со = new CGI; print

После нажатия на кнопку Submit данные отправляются сценарию cgi2.pl.

Закрываем HTML -форму. Все элементы управления, описанные ранее, являются частью одной формы анкеты, созданной в cgil.pl. Для открытия формы использовался метод startform, а для ее закрытия — endform:

$со = new CGI; print

Закрываем HTML- документ. Чтобы завершить работу с HTML-документом, используйте метод end_html, который выводит теги . Вот как заканчивается страница с анкетой в сценарии cgil.pl:

#!/usr/local/bin/perl $со = new CGI;

На этом cgil.pl кончается. Когда пользователь введет данные и нажмет кнопку Submit, будет вызван сценарий cgi2.pl, который выведет сводку анкеты.

Функционально-ориентированное CGI -программирование. До сих пор мы использовали объектно-ориентированные методы. Однако пакет CGI имеет и функционально-ориентированный интерфейс (Впрочем, при обращении к нему некоторые возможности объектно-ориентированною интерфейса становятся недоступными). В примере ниже используется функционально ориентированный интерфейс пакета CGI. Код генерирует текстовое поле с предложением ввести имя пользователя. После нажатия на кнопку Submit данные возвращаются к тому же CGI-сценарию, который с помощью функции рагаm выводит введенное имя в нижней части Web-страницы:

Листинг 5. 9 . Функционально ориентированный интерфейс пакета CGI.

use CGI qw/:standard/;

print header(-charset=>’windows-1251′, -lang=>’ru’),

start_html(‘ CGI Functions Example’ ),H2(‘CGI Functions Example’),

start_form, «Please enter your name: «, textfield(‘text’), p,

submit(-value=>’Отправить’), reset(-value=>’Отмена’), end_form,hr;

Использование cgi-lib.pl. Ранее рассказывалось о CGI-программировании на базе методов стандартного модуля CGI.pm. He менее популярен среди программистов пакет cgi-lib.pl. Поскольку многие CGI-сценарии на Perl написаны с его помощью, далее рассказывается именно о нем. Авторские права на этот пакет принадлежат его создателю Стивену Е. Бреннеру, на домашней странице которого (http://cgi-lib.stanford.edu/cgi-lib) можно получить копию cgi-lib.pl. Вам разрешается работать с cgi-lib.pl и даже изменять его до тех пор, пока ваши действия не будут ущемлять описанные в начале файла авторские права. Особая процедура установки не требуется — файл cgi-lib.pl копируется в каталог, где хранятся CGI-сценарии, и с помощью команды require подключается к ним:

Если у вас нет этого пакета — просто используйте модуль CGI.pm в таком контексте:

use CGI qw/:ReadParse, PrintHeader, HtmlTop, HtmlBot, SplitParam/;

Далее создаются два сценария, генерирующие те же страницы, что и в предыдущей главе, но вместо CGI.pm на сей раз будет использован пакет cgi-lib.pl. Предыдущие сценарии назывались cgil.pl и cgi2.pl, а в этой речь пойдет о libl.pl и lib2.pl.

Пакет cgi-lib.pl подключается к сценарию с помощью команды require. (He запрещено использовать также use, но вряд ли вам встретится такой вариант.) В отличие от модуля CGI.pm, количество функций, генерирующих теги HTML в cgi-lib.pl, крайне ограничено. Обычно эти теги приходится выводить вручную. (Пакет cgi-lib.pl предназначался в первую очередь для разбора посланных сценарию данных.) Впрочем, некоторые теги HTML все же генерируются автоматически: подпрограмма PrintHeader создает шапку HTML, необходимую для страницы, раздел HtmlTop (метки и ). Также с ее помощью можно создать заголовок страницы, как показано в следующем примере, задающем страницу с заголовком «My Web Page»:

require ‘cgi-lib. рl’;

После описания начала страницы остальная разметка HTML (в том числе формы) создается путем непосредственного вывода тегов. Например, вот так задается заголовок :

Hello!

Чтобы прочитать данные, переданные CGI-сценарию, используется подпрограмма ReadParse. Она создает хэш (обычно называемый %in) и записывает в него значения элементов данных, переданных сценарию. Элементы данных адресуются по именам, присвоенным соответствующим элементам HTML. Например, следующий код создает хэш %in и, читая данные текстового поля ‘text’, выводит их:

print «Here is the text: «, $in(‘text’), » .»;

CGI.pm : include image?

I’m writting Perl/CGI script with the module CGI.pm. I can return text/html, but can’t include an image within it, it always display the ‘alt’ tag and I’m sure about the href link.

1 Answer 1


First, you’re not getting the alt text. You’re sending -src http://www.perl.org/simages/lcamel.gif -alt Powered by Perl , so the image doesn’t even have alt text.

The first argument of img should be a hash of attributes. The rest is taken as child elements.

The dashes are optional, so you could also use

Модуль cgi pm

CGI.pm is a Perl module for creating and parsing CGI forms. It is distributed with core Perl as of Perl 5.004, but you can also retrieve CGI.pm from CPAN, and you can get the very latest version at any time from ftp://ftp-hygenome.wi.mit.edu/pub/software/WWW/ .

CGI is an object-oriented module. Don’t let the object-oriented nature scare you off, though; CGI.pm is very easy to use, as ev >

As with any Perl module, the first thing you do is call the module with use . You then call the constructor ( new() ), creating a new CGI object called $query . Next, get the value of the birthday parameter from the CGI program using the param method. Note that CGI.pm does all the work of determining whether the CGI program is being called by the GET or POST methods, and it also does all the URL decoding for you. To generate output, use the header method to return the content type header, and the p method to generate a paragraph marker

However, this is only the tip of the iceberg as far as what CGI.pm can do for you. There are three basic categories of CGI.pm methods: CGI handling, creating forms, and retrieving environment variables. (A fourth category is creating HTML tags, but we don’t cover those in detail.) Table 10.1 lists most of these methods. They are also covered in more detail later in this chapter.

Table 10.1: CGI.pm Methods
CGI Handling
keywords Gets keywords from an search.
param Gets (or sets) the value of parameters.
append Appends to a parameter.
import_names Imports variables into a namespace.
delete Deletes a parameter.
delete_all Deletes all parameters.
save Saves all parameters to a file.
self_url Creates self-referencing URL.
url Gets URL of current script without query information.
header Creates HTTP header.
redirect Creates redirection header.
cookie Gets (or sets) a cookie.
nph Declares this to be a NPH script.
dump Prints all name/value pairs.
Form Generation
start_html Generates an tag.
end_html Generates an tag.
autoEscape Sets whether to use automatic escaping.
isindex Generates an tag.
startform Generates a tag.
start_multipart_form Generates a tag for multipart/ form-data encoding.
textfield Generates an tag.
textarea Generates an

tag.

password_field Generates an tag.
filefield Generates an tag.
popup_menu Generates a popup menu via and tags.
scrolling_list Generates a scrolling list via and tags.
checkbox_group Generates a group of checkboxes via multiple tags.
checkbox Generates a single checkbox via a tag.
radio_group Generates a group of radio buttons via tags.
submit Generates a tag.
reset Generates a tag.
defaults Generates a tag.
hidden Generates an tag.
image_button Generates a clickable image button via a tag.
button Generates a JavaScript button.
Handling Environment Variables
accept Gets accept types from ACCEPT header.
user_agent Gets value of USER_AGENT header.
path_info Gets value of EXTRA_PATH_INFO header.
path_translated Gets value of PATH_TRANSLATED header.
remote_host Gets value of REMOTE_HOST header.
raw_cookie Gets value of HTTP_COOKIE header.
script_name Gets value of SCRIPT_NAME header.
referer Gets value of REFERER header.
auth_type Gets value of AUTH_TYPE header.
remote_user Gets value of REMOTE_USER header.
user_name Gets user name (not via headers).
request_method Gets value of REQUEST_METHOD header.

Each of these methods is covered later in this chapter, in alphabetical order.

Модуль cgi pm

Хотя нет, не лучше. Теперь я слышу стоны. Стоны дизайнеров и HTML-верстальщиков. Это люди, воюющие на фронтах, далеких от страны программирования. Для них приведенный выше как китайская грамота. И они задыхаются от того, что не могут легко изменить внешний вид страницы, сгенерированной программой. Мы, программисты, должны испытывать милосердие по отношению к таким людям. А значит, во всем стараться им помогать. Так что перейдем к делу.

Итак, приблизим Perl по удобству программирования к PHP, сохранив в то же время все его лучшие качества. Для этого нужно проделать 3 шага:

  1. избавиться от надоедливой 500-й ошибки;
  2. научиться принимать данные из форм так же легко, как это позволяет делать PHP;
  3. добиться того, чтобы в скриптах работали псевдо-PHP .

Комплексная проблема, в отличие от такого же обеда, смертельна не всегда. В нашем случае мы сначала рассмотрим мощный модуль CGI::WebOut, который решает первую часть проблемы. Следующие наблы будут посвящены оставшимся задачам.

В предыдущей набле мы в деталях рассмотрели способ, позволяющий побороть 500-ю ошибку и выводить все предупреждения прямо в окно браузера, что неоценимо при отладке скриптов. Чтобы не писать весь этот код каждый раз, я сгруппировал его и множество других возможностей в модуле CGI::WebOut, который вы можете скачать из архива по адресу http://www.dklab.ru/chicken/mod/ppd (для Windows) или http://www.dklab.ru/chicken/mod/cpan (для Unix). О том, как устанавливать модули в различных операционных системах, читайте в следующей набле.

Предположим, CGI::WebOut установлен. На примерах посмотрим, что мы теперь можем делать.

Избавление от 500-й ошибки, печать предупреждений в браузер

Вывод заголовков уже после вывода тела

Временный перехват выходного потока

Perl и CGI программы — особенности использования

1. Использование готовых скриптов

Если у вас уже есть написанные CGI-скрипты, то прежде чем скопировать их на сервер, вы должны сделать следующие действия:

  • Убедиться, что в скриптах указан правильный путь к интерпретатору:

Perl: /usr/bin/perl
Python : /usr/local/bin/python

  • Если вашему скрипту требуется доступ к базе данных MySQL , то необходимо указать параметры доступа (см. статью Подключение к серверу MySQL)
  • В разделе Управление веб-серверомпанели управления хостингом включить модуль CGI.

Теперь вы можете скопировать свои скрипты на сервер.
Загружать файлы необходимо в каталог ваш_домен/cgi. Файлы из данного каталога будут доступны по адресу http://ваш_домен/cgi-bin/имя_файла. Для того чтобы CGI-скрипты запускались из корневого каталога сайта ваш_домен/docs, необходимо создать в нем файл .htaccess со следующим содержимым:

На скрипты необходимо установить права доступа 755 или -rwxr-xr-x.
Права доступа можно изменить с помощью файлового менеджера панели управления.

2. Написание простейшего CGI-скрипта

Рассмотрим написание простого CGI скрипта на Perl.
Если вы работаете под управлением ОС «Windows», то для работы с кодом скриптов вам необходимо использовать специализированный текстовый редактор, например, Notepad++. Стандартную для Windows программу «Блокнот» лучше не использовать. Для демонстрации работы CGI скрипта необходимо создать два файла. Первый файл представляет собой html-документ с формой ввода текста:

HTML PUBLIC «-//W3C//DTD HTML 4.0//EN»>

Пример работы с Perl

Иллюстрированный самоучитель по Perl

CGI-сценарии

В приведенном тексте появились некоторые новые элементы, которые необходимо пояснить.

Подпрограмма process_input модуля cgi_utiis.pm передает декодированные данные через вызываемый по ссылке параметр – ассоциативный массив. [Кроме того, она возвращает при помощи функции return () те же данные, но в виде строки, состоящей из пар имя=значение, разделенных символом «&». Обратите внимание на то, как подпрограмма вызывается в основной программе:

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

Этот фрагмент необходим для того, чтобы правильно обработать следующую ситуацию из нашего примера. Выбраны несколько переключателей, определяющих языки, которыми владеет пользователь: русский, английский, французский. Так как соответствующие элементы формы имеют одинаковые имена name=language, то без проверки в ассоциативный массив %fcrm_ref, куда помещаются обработанные данные, попадет только информация от последнего обработанного Элемента name=language value=french. В Подобном случае обычное присваивание заменяется операцией присваивания с конкатенацией:

В основной программе registrar.cgi обратим внимание на то, как передается ссылка на готовый HTML-документ. Для этого вместо заголовка content-type: text/html выводится заголовок Location: URL, сообщающий серверу адрес документа.

Еще один новый элемент в основной программе – сохранение данных в файле с именем users.

Модуль CGI.pm

Пример, рассмотренный выше, демонстрирует наивный подход, когда кажется, что все необходимые программы надо писать самостоятельно с самого начала. Но программирование CGI – это такая область, в которой Per] давно и активно применяется, и многое из того, что может потребоваться, уже давно кем-то написано. Надо только найти и использовать. В. данном разделе мы сделаем краткий обзор одного из таких готовых средств, предназначенных для поддержки разработки CGI-приложений.

Модуль CGI.pm, созданный Линкольном Штейном, входит в состав дистрибутивного комплекта Perl, начиная с версии 5.004, и его даже не нужно специально инсталлировать.

Этот модуль содержит большой набор функций для создания и обработки HTML-форм. Мы посвятили значительную часть предыдущего раздела изучению многочисленных тэгов, чтобы затем написать HTML-код для создания формы в примере 15.1. Модуль CGI позволяет сделать то же самое, но без использования HTML. С его помощью можно описать форму на языке Perl, используя вместо тэгов обращения к функциям модуля. В результате получится не документ HTML, а сценарий на языке Perl, который при вызове будет «на лету» генерировать HTML-форму и передавать серверу для отправки клиенту.

Модуль CGI является не просто модулем, а классом, что позволяет использовать преимущества объектно-ориентированного подхода. Модуль предоставляет пользователю на выбор два вида интерфейса с самим собой: процедурно-ориентированный и объектно-ориентированный.

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

Директива use импортирует в пространство имен вызывающей программы некоторый стандартный набор функций. Помимо него, существуют другие наборы функций модуля CGI. Их можно импортировать, указав имя соответствующего набора в списке импорта директивы use. Имена всех наборов можно просмотреть в файле CGI.pm, где они содержатся в хеш-массиве:

Функции header (), start_html О, hi () являются функциями модуля CGI. Они будут рассмотрены ниже.

Предмет Web-программирования Программирование на стороне клиента и сервера Инструменты и технологии программирования

Использование CGI.pm. Итак, как coздается CGI сценарий? Теоретически это очень просто — программа CGI, как и любая другая программа на Perl, выполняет обычные команды Perl, когда она вызывается броузером (то есть когда броузеру в качестве URL задается CGI-сценарий). Все, что вы направляете в стандартный вывод, передается броузеру. Так, если CGI-сценарий выполняет команду print «Hello!», этот текст будет возвращен броузеру, и на странице появится надпись «Hello'» Но это рудиментарный способ. Требуется ли прочитать данные, введенные пользователем с помощью элементов управления, расположенных на странице? Или вы захотите создать эти элементы управления из сценария? Чтобы сделать все это и многое другое, используется прилагающийся к Perl пакет CGI.pm. (Далее мы рассмотрим другой популярный пакет — cgi-lib.pl.) С одной стороны, это стандартный способ работы с CGI средствами Perl, с другой — отличное введение в CGI.pm.

Итак, интерпретатор Perl содержит, среди других модулей, стандартный модуль CGI.pm. По­этому если у вас установлен Perl, то, скорее всего, есть и CGI.pm. Начиная с пятой версии Perl CGI.pm стал объектно-ориентированным, хотя упрощенный функционально-ориентиро­ванный интерфейс все еще существует. В наших примерах мы будем использовать объектно-ориентированное программирование. Создавая с помощью CGI.pm объекты CGI, мы будем вызывать различные методы этого объекта. Существуют методы, соответствующие практи­чески всем основным тегам HTML, и при их вызове создается нужный тег с указанными ат­рибутами. Все они могут получать именованные параметры (за исключением методов, тре­бующих один аргумент), иными словами, требуется указать не только значение атрибута HTML, но и его имя. В следующем примере объект CGI создает Web-страницу посредством встроенных методов. Обратите внимание на именованные параметры метода textarea, за­дающие имя области редактирования текста (‘textarea’), значение по умолчанию и размеры:

Листинг 5.6. Создание Web- страницы.

print $co->header, $co->start_html(-title=>’CGI Example’),

$co->center($co->H2(‘Welcome to CGI!’)),

-default => ‘No opinion’,

Если возможности объектно-ориентированного интерфейса не требуются, пакет CGI.pm также поддерживает простой функционально-ориентированный интерфейс. Мы рассмотрим пример применения функционально-ориентированного интерфейса CGI.pm ниже.

Создание и использование элементов управления HTML. Изучать программирование лучше всего на примерах. Потому ниже приводятся два CGI-сценария: один создает Web-страницу с элементами управления — полями ввода текста, переключателями, кнопками, включая Submit, а второй читает данные, введенные пользователем на этой странице. Оба сценария — вариации с небольшими дополнениями на тему оператора print, который собственно и создает страницу.

Первый сценарий хранится в файле cgil.pl, и в справочных целях полностью приводится в листинге 6-7. Когда пользователь открывает сценарий в броузере (переходя по его адресу — например, /user/cgi/cgil.pl), сценарий возвращает страницу с элементами управления HTML и текстом. В данном случае это страница анкеты.

Страница содержит приветствие и сообщение о том, что посетители, не желающие заполнять анкету, могут перейти по ссылке на сервер CPAN (Comprehensive Perl Archive Network — всеобъемлющий архив, посвященный языку Perl).

Затем вы увидите запрос имени пользователя с текстовым полем и вопрос о его мнении с областью редактирования текста (многострочное текстовое поле).

Просматривая анкету дальше, вы увидите еще несколько элементов управления — кнопки с зависимой и независимой фиксацией, списки, а также кнопка подтверждения и очистки анкеты. Позже мы рассмотрим, как создать все эти элементы управления на примере предложенных сценариев. Когда пользователь нажимает на кнопку Submit, расположенную в конце анкеты, броузер собирает данные, введенные на странице, и передает их другому CGI-сценарию, cgi2.pl. В справочных целях он приведен в листинге 6-8.

В общем, нет никакой необходимости создавать CGI-сценарий, генерирующий анкету, — можно просто написать страницу HTML, которая будет вызывать cgi2.pl по нажатию пользователем кнопки Submit. Подход, требующий генерации кода, выбран лишь затем, чтобы продемонстрировать обе стороны процесса — как создать элементы управления HTML из CGI-сценария и как прочесть данные из этих элементов управления.

Листинг 5.7. cgi 1 .pl

use CGI; $co = new CGI;

$labels <'1'>= ‘Sunday’; $labels <'2'>= ‘Monday’;

$labels <'3'>= ‘Tuesday’; $labels <'4'>=’Wednesday’;

$labels <'5'>= ‘Thursday’; $labels <'6'>= ‘Friday’;

print $co->header(-charset=>’windows-1251′, -lang=>’ru’),

-title => ‘CGI Example’,

$co->center($co->H2(‘Here is the Survey!’)),

$co->H3(‘Please fill out survey. ‘),

«Reasons for filling out our survey:», $co->p,

$co->ul( $co->li(‘Fame’), $co->li(‘Fortune’), $co->li(‘Fun’ ) ),

«If you would rather not fill out our survey, «,

«you might be interested in «,

«Please enter your name: «, $co->textfield(‘text’), $co->p,

«Please enter your opinion: «, $co->p,

$co->textarea( -name => ‘textarea’,

-default => ‘No opinion’,

$ co->p, «Please indicate what products you use: «, $co->p,

-values => [‘Shampoo’,’Toophpaste’,’Bread’, ‘Cruise missiles’ ],

-defaults => [‘Bread’,’Cruise missiles’] ), $co->p,

«Please indicate your income level: «, $co->p,

$co->scrolling_list(‘list’, [‘Highest’,’High’,’Medium’,’Low’ ], ‘High’), $co->p,

«Please indicate your day of a week: «, $co->p,

-labels => \%labels), $co->p,

«Thank you for filling out our survey. Please indicate «,

«How much unsolicited mail you like to get: «, $co->popup_menu(

-values => [‘Very much’,’A lot’,’Not so much’,’None’] ), $co->p,

$co->center( $co->submit, $co->reset, ),

Листинг 5.8. cgi2.pl

use CGI; $co = new CGI;

print $co->header(-charset=>’windows-1251′, -lang=>’ru’),

-title => ‘CGI Example’,


$co->center($co->H2(‘Thanks for filling out our survey.’)),

$co->H4(‘Here is your responses. ‘), $co->hr;

$co->em($co->param(‘text’)), «.», $co->p, «Your opinions are: «,

«You use these products: » ,

$co->p, «Your income level is:», $co->em($co->param(‘list’)),».»,

$co->p, «Today is day «,

$co->em($co->param(‘radios’)), « of the week.», $co->p,

«How much unsolicited mail you like: «,

«The hidden data is «, $co->em(join(«, «,

print $co->hr; print $co->end_html;

Начинаем HTML- документ. Начало работы над документом HTML строится следующим образом. Вначале вы создаете CGI объект, затем с помощью метода header этого объекта — HTTP-заголовок (в данном примере создается простая шапка документа, но допустимы сколь угодно сложные шапки с любыми атрибутами, например, -charset=>’windows-1251′). Заголовок можно сформировать и самостоятельно, напимер, командой print. Метод start_html начинает сам документ HTML. Этот метод создает секцию , а также позволяет указать некоторые атрибуты , как-то: цвет для изображения фона и ссылок. Ниже приведен фрагмент кода cgil.pl, открывающий страницу. Обратите внимание: чтобы результаты работы методов header и start_html попали на страницу, необходимо использовать функцию print:

-title => ‘CGI Example’ ,

Создаем заголовки HTML. После создания шапки CGI-методы типа H2, H3, H4 и др. помогут создать заголовки, соответствующие тегам , , и т. д. Ниже приведен фраг­мент кода, генерирующий заголовки и в начале Web-страницы с анкетой. В данном случае это простое приглашение пользователю.

$со = new CGI; print

$co->H2(‘Here is the Survey!,’),

$co->H3(‘Please fill out survey. ‘)

Центрируем элементы. Чтобы центрировать текст с помощью тегов , используется CGI-метод center. В следующем примере центрируется заголовок, созданный в предыдущем примере:

$со = new CGI; print

$co->center($co->H2(‘Here is the Survey!’)),

$co->H3(‘Please fill out survey. ‘),

Создаем маркированный список. CGI-методы ul и li создают несортированный маркированный список (теги


    и
    соответственно). Ниже приведен фрагмент кода, представляющий пользователю несколько аргументов, побуждающих заполнить анкету:

$со = new CGI; print «Reasons for filling out our survey:»,

$co->li(‘Fame’), $co->li (‘ Fortune ‘), $co->li(‘Fun’ ), )

Создаем гиперссылку. Гиперссылки помещаются на страницу CGI-методом а, как в примере ниже, где выводится URL для перехода (на случай, если пользователь не заинтересован в заполнении анкеты, созданной сценарием cgil.pl):

$со = new CGI; print

«If you would rather not fill out our survey , «,

«you might be interesed in»,

Создаем горизонтальную полосу. Для создания горизонтальной линии (метка ) используется CGI-метод hr:

$со = new CGI; print

Создаем HTML -форму. Элементы управления HTML группируются в формы. В примере с анкетой для создания формы использовался GGI-метод startform. После нажатия кнопки Submit данные из элементов управления должны быть прочитаны и переданы сценарию, формирующему сводку данных, то есть cgi2.pl. URL этого сценария указывается в атрибуте action формы:

#!/usr/local/bin/perl $со = new CGI; print

Все последующие элементы управления будут включены в форму, потому что метод startform генерирует тег .

Замечание. Если startform вызывается без аргументов, кнопка Submit возвращает введенные данные той же форме. Ниже рассказывается, как использовать такую возможность.

Работаем с текстовыми полями. Для создания текстового поля, позволяющего вводить текст, используется CGI-метод textfleld. В примере ниже создается текстовое поле, предназначен­ное для хранения имени пользователя.

«Please enter your name: ‘ ,

Чтение данных из элементов управления HTML. Элементы управления созданы (точнее, пока только текстовое поле), но как считать из них данные? Когда пользователь нажмет на кнопку Submit, броузер отправит данные формы сценарию cgi2.pl; CGI-метод param в нем как раз и предназначен для чтения данных. Ему достаточно передать имя, присвоенное текстовому полю, в данном случае — ‘text’ (см. предыдущий раздел), а вывод выполняется следующим образом:

print «Your name is: «, $co->em($co->param( ‘text ‘)), «.»;

Метод em создает метку , которая большинством броузеров воспринимается как указание на переход к курсивному начертанию.

Работаем с текстовыми областями. Текстовая область может содержать несколько строк текста. Вот как в cgil.pl создается текстовая область, предназначенная для ввода любого мнения пользователя (задается как описание самой области в 10 строк по 60 символов в каждой, так и некоторого текста по умолчанию, а также имени области, ‘textarea’):

$со = new CGI; print «Please enter your opinion; «, $co->p,

-default => ‘No opinion’,

А во фрагменте ниже, CGI-метод param считывает текст и выводит данные анкеты:

print «Your opinions are: «, $co->em($co->param(‘textarea’)), «.»;

Работаем с кнопками с независимой фиксацией. Кнопки с независимой фиксацией (check­buttons) обычно объединяются в группу, что позволяет возвращать имена выбранных эле­ментов управления в одном списке. Во фрагменте кода, приведенном ниже, с помощью CGI-метода , checkbox_group как раз и создается такая группа. Ей присваивается имя, кноп­ки получают подписи и задаются пункты, выбранные по умолчанию при выводе Web-страницы:

#!/usr/local/bin/perl $со = new CGI; print

«Please indicate what products you use. «,$co->p,

-values => [‘Shampoo’, ‘Toothpaste’ , ‘Bread’, ‘Cruise missiles’],

-defaults => [‘Bread’ , ‘Cruise missiles’ ] )

Код ниже предназначен для проверки и вывода выбора пользователя. В данном случае param возвращает список имен помеченных кнопок, поэтому потребовался вызов функции join, объединяющей элементы списка в строку:

print «You use these products: «, $co->em(join(«, «, $co->param(‘checkboxes’))),

Работаем со списками. Список с готовыми значениями можно прокрутить в случае, когда невозможно одновременно вывести па экран все его строки. Этот элемент управления созда­ется CGI-методом scrolling_list. В сценарии cgil.pl список позволяет выбрать уровень доходов. Он называется ‘list’ и включает строки ‘Highest’, ‘High’, ‘Medium’ и ‘Low’, причем по умолчанию выбрано ‘High’:

$со = new CGI; print «Please indicate your income level: «,$co->p,

[‘Highest’, ‘High’, ‘Medium’, ‘Low’], ‘High’, )

Ниже приведен пример чтения и вывода выбранной строки:

print «Your income level is: «, $co->em($co->param(‘list’)), «.»;

Работаем с кнопками с зависимой фиксацией. Кнопки с зависимой фиксацией (radiobuttons) позволяют сделать однозначный выбор из нескольких значений. Например, в cgil.pl создается семь таких кнопок. Они объединяются в группу ‘radios’ и получают значения от ‘1’ до ‘7’, а метки прикрепляются к ним с помощью хэша %labels:

$labels <'1'>= ‘Sunday’; $labels <'2'>= ‘Monday’:

$labels <'3'>= ‘Tuesday’; $labels <'4'>= ‘Wednesday’;

$labels <'5' >= ‘Thursday’, $labels <'6'>= ‘Friday’;

print «Please indicate your day of a week: «, $co->p,

Ниже приведен пример чтения и печати выбранного элемента, взятый из сценария cgi2.pl:

print «Today is day ‘, co->param(‘radios’), » of the week.»;

Работаем с раскрывающимся списком. В HTML раскрывающийся список представляет собой набор элементов, который пользователь может открыть нажатием кнопки, обычно сопровождающийся изображением стрелки вниз. Пользователь может выбрать элемент списка, а вы — определить, на чем он остановился. Вот как делается выбор количества непрошеной почты, которое пользователь согласен получать (пример взят из нашей анкеты). Элементы задаются при помощи метода popup_menu:

$со = new CGI; print

-values => [‘Very much’, ‘A lot’,’Not so much’ , ‘None’ ] )

Далее приведен пример чтения и печати выбора пользователя, взятый из сценария cgi2.pl:

print «How much unsolicited mail you like»,

Работаем со скрытыми полями данных. Данные, хранящиеся в скрытом поле на Web-странице, невидимы для пользователя. (Это удобно, когда сценарий ожидает получить некоторые неизменные сведения о странице.) Такие поля создаются следующим образом:

$со = new CGI; print

И вот как вывести эти данные из cgi2.pl:

print «The hidden data is: «,

Создаем кнопки отмены и подтверждения. Чтобы отправить на сервер данные формы, пользователь должен нажать кнопку Submit. Она создается CGI-методом submit. Аналогично, кнопка Reset, которая очищает данные формы, создается методом reset. Ниже приведен пример кода, создающий кнопки Submit и Reset на Web-странице:

$со = new CGI; print

После нажатия на кнопку Submit данные отправляются сценарию cgi2.pl.

Закрываем HTML -форму. Все элементы управления, описанные ранее, являются частью одной формы анкеты, созданной в cgil.pl. Для открытия формы использовался метод startform, а для ее закрытия — endform:

$со = new CGI; print

Закрываем HTML- документ. Чтобы завершить работу с HTML-документом, используйте метод end_html, который выводит теги . Вот как заканчивается страница с анкетой в сценарии cgil.pl:

#!/usr/local/bin/perl $со = new CGI;

На этом cgil.pl кончается. Когда пользователь введет данные и нажмет кнопку Submit, будет вызван сценарий cgi2.pl, который выведет сводку анкеты.

Функционально-ориентированное CGI -программирование. До сих пор мы использовали объектно-ориентированные методы. Однако пакет CGI имеет и функционально-ориентированный интерфейс (Впрочем, при обращении к нему некоторые возможности объектно-ориентированною интерфейса становятся недоступными). В примере ниже используется функционально ориентированный интерфейс пакета CGI. Код генерирует текстовое поле с предложением ввести имя пользователя. После нажатия на кнопку Submit данные возвращаются к тому же CGI-сценарию, который с помощью функции рагаm выводит введенное имя в нижней части Web-страницы:

Листинг 5. 9 . Функционально ориентированный интерфейс пакета CGI.

use CGI qw/:standard/;

print header(-charset=>’windows-1251′, -lang=>’ru’),

start_html(‘ CGI Functions Example’ ),H2(‘CGI Functions Example’),

start_form, «Please enter your name: «, textfield(‘text’), p,

submit(-value=>’Отправить’), reset(-value=>’Отмена’), end_form,hr;

Использование cgi-lib.pl. Ранее рассказывалось о CGI-программировании на базе методов стандартного модуля CGI.pm. He менее популярен среди программистов пакет cgi-lib.pl. Поскольку многие CGI-сценарии на Perl написаны с его помощью, далее рассказывается именно о нем. Авторские права на этот пакет принадлежат его создателю Стивену Е. Бреннеру, на домашней странице которого (http://cgi-lib.stanford.edu/cgi-lib) можно получить копию cgi-lib.pl. Вам разрешается работать с cgi-lib.pl и даже изменять его до тех пор, пока ваши действия не будут ущемлять описанные в начале файла авторские права. Особая процедура установки не требуется — файл cgi-lib.pl копируется в каталог, где хранятся CGI-сценарии, и с помощью команды require подключается к ним:

Если у вас нет этого пакета — просто используйте модуль CGI.pm в таком контексте:

use CGI qw/:ReadParse, PrintHeader, HtmlTop, HtmlBot, SplitParam/;

Далее создаются два сценария, генерирующие те же страницы, что и в предыдущей главе, но вместо CGI.pm на сей раз будет использован пакет cgi-lib.pl. Предыдущие сценарии назывались cgil.pl и cgi2.pl, а в этой речь пойдет о libl.pl и lib2.pl.

Пакет cgi-lib.pl подключается к сценарию с помощью команды require. (He запрещено использовать также use, но вряд ли вам встретится такой вариант.) В отличие от модуля CGI.pm, количество функций, генерирующих теги HTML в cgi-lib.pl, крайне ограничено. Обычно эти теги приходится выводить вручную. (Пакет cgi-lib.pl предназначался в первую очередь для разбора посланных сценарию данных.) Впрочем, некоторые теги HTML все же генерируются автоматически: подпрограмма PrintHeader создает шапку HTML, необходимую для страницы, раздел HtmlTop (метки и ). Также с ее помощью можно создать заголовок страницы, как показано в следующем примере, задающем страницу с заголовком «My Web Page»:

require ‘cgi-lib. рl’;

После описания начала страницы остальная разметка HTML (в том числе формы) создается путем непосредственного вывода тегов. Например, вот так задается заголовок :

Hello!

Чтобы прочитать данные, переданные CGI-сценарию, используется подпрограмма ReadParse. Она создает хэш (обычно называемый %in) и записывает в него значения элементов данных, переданных сценарию. Элементы данных адресуются по именам, присвоенным соответствующим элементам HTML. Например, следующий код создает хэш %in и, читая данные текстового поля ‘text’, выводит их:

print «Here is the text: «, $in(‘text’), » .»;

Илон Маск рекомендует:  Что такое код setcolor
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL