CGI на Perl. Первые шаги.


Оглавление (нажмите, чтобы открыть):

Шаг 4 — Тестируем CGI

Шаг 4 — Тестируем CGI

Сейчас мы проверим, работает ли наш Apache. Для этого нам понадобится «Hello, World!», соответствующий CGI-стандарту.

Так он выглядит. Сохраните этот код в файл test.cgi в поддиректорию cgi-bin той директории, куда у вас установлен Apache. Запустите свой браузер и наберите в адресной строке http://localhost/cgi-bin/test.cgi.

А теперь о том, как это работает. HTTP-сервер Apache слушает 80-ый порт. Ваш браузер к этому порту подсоединяется и отправляет запрос соответствующий стандартам протокола HTTP. Сервер Apache, получив запрос, выдаёт на него ответ. Ответом может быть, например, HTML-страничка или вывод CGI-программы. Для конечного пользователя особой разницы нет. Естественно, что ответ тоже должен соответствовать протоколу. Необходимый минимум для этого в программе — это строка print «Content-Type: text/html\n\n»;. Ею мы создали заголовок ответа. Заголовок отделяется от тела пустой строкой, поэтому у нас в конце два символа перевода строки. Строку Content-Type: text/html можно расшифровать следующим образом — «ответ будет текстовый, это будет HTML-страница». Он может быть и таким «Content-Type: image/gif» — «ответ будет картинкой в формате GIF». Но о протоколах нам пока рано. Я подробно расскажу об этом, но позже. А в этом шаге я ещё коснусь скрипта, который записывается в директорию cgi-bin при инсталляции. Он называется printenv.pl. Попробуйте набрать в адресной строке браузера http://localhost/cgi-bin/printenv.pl.

Он вывел вам все переменные окружения. Его код вы можете легко посмотреть, открыв любым текстовым редактором. Там много лишнего для ваших неокрепших умов 🙂 Можно чуть-чуть попроще:

Первая строка как обычно. Вторая — заголовок, только теперь это обычный «текстовый текст» :))) Незнакомые конструкции встречаются в третьей и четвёртой строке. Что это за конструкции я объясню в следующих шагах. А пока в двух словах принцип действия скрипта. Для скрипта переменные окружения — это хэш. Скрипт проходит в цикле по всем ключам этого хэша, выбирает значения этих ключей и выводит их на экран. Функция вывода нам уже знакома. Только на этот раз выводится не просто строка, а строка с переменными. Да ещё и содержащая в себе символ «. Интерпретатор считает строкой всё, что заключено в двойные кавычки («) или одинарные кавычки (). Поэтому строку вида «какая-то строка, содержащая строку «внутренняя строка»» он посчитает двумя строками — «какая-то строка, содержащая строку « и «». Естественно, что он не поймёт, что это между строками такое болтается — внутренняя строка — и будет ругаться. Для этого символы, которые использует интерпретатор — «, , #, @, [, ], $, %, надо «экранировать» символом \. Ууууу. понаварочил 🙂 Осталось рассказать только про комментарии. В скрипте printenv.pl после первой строки вы видели примерно следующее:

Это комментарий. Всё, что написано после символа # и до конца строки интерпретатор игнорирует. Для этого шага всё. В следующем продолжим разбирать непонятные моменты этого демонстрационного скрипта. Такой маленький, а разговора хватит на несколько шагов.

Глава 19

Если в течение последних нескольких лет вы не сидели взаперти в деревянной хижине без злектричества, то вы наверняка слышали о World Wide Web. Web содержит также большой обіем текста. Поскольку мы имеем

В зтой главе мы не только изучим основы CGI-программирования, но и параллельно получим определенные начальные сведения о гипертекстовых ссылках, библиотечных модулях и обьектно-ориентированном программи-ровании на Perl. В конце главы мы

Если рассматривать зту главу как отдельное пособие, следует отметить, что ее (как и любого другого документа обьемом меньше пары сотен страниц) недостаточно для изучения более сложных тем, затронутых здесь, в частности обьектно-ориентир

Мы предполагаем, что вы уже в основном знакомы с HTML.

Начиная с версии 5.004, в состав стандартного дистрибутива Perl вклю-чается модуль CGI.pm, How to Setup and Maintain Your Web Site, превращает процедуру создания CGI-программ на Perl

* Если у вас инсталлирована одна из более ранних версии Perl (но как минимум 5.001) и вы еще не собрались пе

Если CGI.pm уже инсталлирован у вас в системо, вы можете прочесть его полную документацию, воспользовавшись любым из способов, кот

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

Ваша CGI-программа в контексте

На рис. 19.1 показаны взаимосвязи между Web-броузером, Web-сервером и CGI-программой. Когда вы, работая со своим броузером

Каждое предназначенное для ввода текста поле в зтой форме имеет имя (указанное в HTML-коде формы) и соответствующее значение, которым является все, что вы вводите в зтом поле. Сама форма связана (через HTML-директиву

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

* Pod сокращенно обозначает plain old documentation («обычная старая документация»). Зто упрощенная форма пр

Рис. 19.1. Заполнение форми с привлечением CGI

Когда Web-сервер (в данном случае www.SOMEWHERE.org) получает URL HTTP. При написаний CGI-программы об зтом

Способ получения CGI-программой ее аргументов (й другой информа-ции) от броузера через сервер описывается спецификацией Common Gateway Interface. Об зтом тоже не нужно беспо

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

Click here to receive your fortune.

Зцесь fortune.cgi — программа, которая просто вызывает программу fortune

CGI-программа (в данном случае fortune_or_date) определила бы, какой из двух возможных аргументов получен, и вьшолнила бы с

Как видите, аргументи вовсе не должны иметь формат имя=значение, характерний для HTML-форм. Вы можете написать CGI-программу,

В зтой главе мы будем, главным образом, рассматривать применение HTML-форм. При зтом мы предполагаем, что вы уже знакомы с простими H TML-кодами.

Вот исходный код вашей первой CGI-программы. Она настолько проста, что в ней даже не пришлось использовать модуль CGI.pm:

#самая легкая из CGI -програми print “END of Multiple Text;

Каждый раз, когда зта программа вызывается, она выдает на зкран одно и то же. Зто, конечно, не особенно интересно, но позднее мы сделаем ее более занимательной.

Зта программка содержит всего один оператор: вызов функции print. Несколько забавно вьп-лядящий аргумент — зто

Первая часть зтого строкового значення — определенно самая важная:

строка Content-Type задает тип генерируемой выходной информации. Сразу за ней идет пустая строка, которая не должна содержать пробелов и знаков табуляции.

У большинства новичков первые CGI-программы отказываются рабо-тать, потому что пользователи забывают об зтой пустой строке, отделяющей заголовок (нечто вроде заголовка сообщ

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

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

Сервери обычно позволяют использовать вместо ддинных путевых имен псевдонимы. Сервер, имеющий адрес www.SOMEWHERE.org,

* Зтот заголовок необходим для протокола HTTP, о котором мы упоминали выше.

Передача параметров через CGI

Для передачи параметров в CGI-программы (точнее, в большинство CGI-программ) никакие формы не нужны. Чтобы убедиться в этом, замените URL

Когда вы «нацеливаете» свой броузер на этот URL, броузер не только просит Web-сервер вызвать программу

К вашим услугам — модуль CGI.pm, который всегда разбирает входящий CGI-запрос правильно. Чтобы вставить этот м

где-нибудь в начале программы*.

Оператор use похож на оператор # include языка С тем, что в процессе компиляции извлекает код из другого файла

В данном случае все, что нам нужно использовать из модуля CGI.pm — это функция param () **.

Если аргументы не указаны, функция param () возвращает список всех полей, имевшихся в HTML-форме, на которую отвечает данный CGI-с

* Имена всех Perl-модулей имеют расширение рт. Более того, оператор use подразумевает это расширение. О том,

** Некоторые модули автоматически экспортируют все свои функции, но, поскольку CGI.pm — это на самом деле объектный модуль, за

Несмотря на то что в нашем списке для оператора use имеется всего один элемент, мы будем использовать запись q

# программа ответа на форму о любимом сорте мороженого (версия 1) use CGI qw(param);

my $favorite = param(«flavor»);

Your favorite flavor is $favorite. print “All_Done;

Как сократить объем вводимого текста

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

Мы могли бы перечислить все эти функции в списке, прилагаемом к оператору use, но такой список разросся бы до небывалых размеров. В CGI.pm,

Импортировать все методы обработки аргументов, например param ().

Импортировать все методы создания заполняемых форм, например text-field().

Импортировать все методы, которые генерируют стандартные элементы HTML 2.0.

Импортировать все методы, которые генерируют элементы, предложенные в HTML 3.0 (такие как

,

Импортировать все методы, которые генерируют расширения HTML, характерные для Netscape.

Импортировать все сокращения, генерируемые HTML (т.е. «html2» + «html3» + «netscape»).

Импортировать «стандартные» возможности: «html2», «form» и «cgi».

Импортировать все имеющиеся методы. Полный список приведен в модуле CGI.pm, где определяется переменная %tags.

Мы будем использовать только директиву : standard. (Подробная информация об импортировании функций и переменных из модулей приведе

Вот как выглядит наша программа со всеми сокращениями, которые используются в CGI.pm:

# cgi-bin/ice_cream # программа ответа на форму о любимом

t сорте мороженого (версия 2) use CGI qw(:standard);

print start_html(«Hello World»), hi («Hello World»);

my $favorite = param(«flavor»);

print p(«Your favorite flavor is $favorite.»);

Видите, насколько это проще? Вам не нужно беспокоиться о декодировании данных формы, о заголовках и HTML-тексте, если вы этого не хотите.

Если вам надоело вводить параметры своей программы в броузер — создайте заполняемую форму. К таким формам привыкли большин

Создайте следующую HTML-страницу, которая включает форму с одним компонентом «текстовое поле» и кнопкой передачи. Когда пользователь щелкает на кнопке передачи*, вызывается сценарий ice_cream,

Hello Ice Cream!

Помните, что CGI-программа может выдавать ту выходную HTML-информацию, которую вы ей укажете. Эта информация будет затем передаваться в тот броузер, который обратится к URL

* Некоторые броузеры позволяют обходиться без кнопки передачи, если форма содержит только одно поле для ввода текста. Если курсор находится в этом поле и пользователь нажи

При размещении всех компонентов программы в одном CGI-файле упрощается ее сопровождение. Цена — незначительное увеличение времени

# программа ответа на форму о любимом сорте мороженого

# *и генерирования этой формы* (версия 3) use CGI qw(:standard);

my $favorite = param(«flavor»);

print start_html(«Hello Ice Cream»), hi («Hello Ice Cream»);

print p(«Your favorite flavor is $favorite. «);

print hr, start_form;

print p («Please select a flavor: «, textfield(«flavor»,»mint»));

print end form, hr;

Если во время работы с броузером вы щелкнете на ссылке, которая указывает на эту программу (и если ссылка в конце URL не содержит

Рис. 19.2. Исходная заполняемая форма

Теперь заполните поле Please select a flavor, нажмите клавишу [Enter],

Рис. 19.3. Результат обработки переданного с использованием формы запроса

Другие компоненты формы

Теперь, когда вы знаете, как создавать в форме простые текстовые поля и заполнять их, вам, наверное, интересно будет узнать, как создавать компоненты формы других типов order)

# программа ответа на форму заказа мороженого и генерирования этой формы (версия 4) use strict;

# ввести объявления переменных и выполнить заключение в кавычки use CGI qw(:standard);

print start html(«Ice Cream Stand»), hi («Ice Cream Stand»);


if (paramO) ( # форма уже заполнена

my $who = param(«name»);

my $flavor = param(«flavor»);

my $scoops = param(«scoops»);

my $taxrate = 1.0743;

my $cost = sprintf(«%.2f», $taxrate * (1.00 + $scoops * 0.25));

print p(«0k, $who, have $scoops scoops of $flavor for \$$cost.»);

> else ( # первый проход, представить незаполненную форму

print p(«What’s your name? «,textfield(«name»));

print p(«What flavor: «, popup_menu(«flavor»,

print p(«How many scoops? «, popup_menu(«scoops», [1..3]));

print p(submit(«order»), reset(«clear»));

print end_form(), hr();

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

Ice Cream Stand

What’s your name? |

What flavor: |t»ii4 How many scoops? 11

Рис. 19.4. Более сложная форма

Как вы помните, функция param() при вызове ее без аргументов возвращает имена всех полей формы, которые были заполнены. Таким обра

Вы, возможно, заметили, что обе функции popup_menu () в предыдущем примере имеют весьма странные аргументы. Что означают

print pC’What flavor: «, popup_menu («flavor», \@choises));

работает так же хорошо, как этот:

print pC’What flavor: «, popup_menu («flavor», [‘mint’,’cherry’,’mocha’]));

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

Также, как методом \@массив можно создавать ссылки на именованные массивы и посредством указания [ список ] —

( ключ1, значение!, ключ2, значение2, . >

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

Подробнее о ссылках вы прочитаете в главе 4 книги Programming Perl

Более сложные вызывающие последовательности

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

-VALUES => [ qw(mint chocolate cherry vanilla peach) ],

mint => «Mighty Mint»,

chocolate => «Cherished Chocolate»,

cherry => «Cherry Cherry»,

vanilla => «Very Vanilla»,

peach => «Perfectly Peachy», >,

-MULTIPLE => 1, tl for true , 0 for false

Значения параметров имеют следующий смысл:

Имя компонента формы. Значение этого параметра можно использовать позже для выборки пользовательских данных из формы с помощью функции param().

Ссылка на анонимный хеш. Значения хеша — это метки (элементы списка), которые видит пользователь формы. Когда пользователь выбирае

Ссылка на анонимный массив. Этот массив состоит из ключей хеша, на которые ссылается -labels.

Число, определяющее, сколько элементов списка пользователь будет видеть одновременно.

Истинное или ложное значение (в том смысле, который принят для этих понятий в Perl), показывающее, можно ли будет пользователю фор

Если -multiple установлена в значение «истина», вы можете присвоить список, возвращаемый функцией param(), мас

Вот другой способ создания этого прокручиваемого списка — с передачей ссылки на существующий хеш вместо создания такого хеша «на х

«mint», «Mighty Mint»,

«chocolate», «Cherished Chocolate»,

«cherry», «Cherry Cherry»,

«vanilla», «Very Vanilla»,

«peach», «Perfectly Peachy»,

print scrolling list(

-VALUES => [ keys %flavors ],

-MULTIPLE => 1, #1 for true , 0 for false ) ;

На этот раз мы передаем в функцию значения, вычисленные по ключам хеша %flavors, ссылка на который выполняется с помощью операции

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

Если вы внимательно изучили примеры, приведенные выше, то уже должны быть способны заставить работать простые CGI-программы. А как насчет более сложных? Одна из распространенных задач

* Как мы отметим ниже, это приложение можно было бы назвать программой Webchat (переговоров через

Форма, используемая для создания гостевой книги, довольно проста, она даже проще, чем некоторые из наших форм, посвященных мороженому. Она, правда, имеет некоторые особенности, но не беспокойте

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

touch /usr/tmp/chatfile chmod 0666 /usr/tmp/chatfile

Отлично, но как обеспечить одновременную работу с программой гостевой книги нескольких пользователей? Операционная система не блокирует попытки одновременного доступа к файлам, поэтому если вы

use Fcnti qw(:flock); # импортирует LOCK_EX, LOCKJ3H, LOCK_NB flock(CHANDLE, LOCK_EX) || bail («cannot flock $CHATNAME: $!»);

Аргумент lock_ex функции flock — вот что позволяет нам обеспечить м

Функция flock представляет собой простой, но универсальный механизм блокировки, несмотря на то, что его базовая реализация существенно изменяется от системы к системе. Она н

* В версиях Perl до 5.004 вы должны превратит

Объектно-ориентированное программирование на Perl

Наконец пришло время научить вас пользоваться объектами и классами — и это важнее всего. Хотя решение задачи построения ва

Мы не будем углубляться здесь в теорию объектов, и вы можете просто считать их пакетами (чем они и являются!) удивительных, великолепных вещей, вызываемых косвенно. Объекты содержат подпрог

Пусть, например, модуль CGI.pm возвращает объект $query, который представляет собой входные данные пользовател

Данная запись означает: «Выполнить подпрограмму param () с объектом $query, param (), воспользуйтесь обычным оператором присваивания и сохраните это значение в обычной переменной

Объекты выглядят как скаляры; они хранятся в скалярных переменных (таких как переменная $ query в нашем примере), и из них можно с

Тип конкретного объекта известен как его класс. Имя класса обычно состоит из имени модуля без расширения рт, и к тому же термины «класс» и «модуль» часто используются как эквиваленты. Таким образом, мы можем говорить о CGI-модуле или о

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

$query = CGI->new(); # вызвать метод new() в классе «CGI»

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

Иногда то же самое записывается так:

$query = new CGI; # то же самое

Вторая форма по принципу действия идентична первой. Здесь меньше знаков препинания, благодаря чему в некоторых случаях она более предпочтительна. Однако она менее удобна в качестве компонента б

С точки зрения разработчика объектных модулей, объект — это ссылка на определяемую пользователем структуру данных, часто на анонимный хеш. Внутри этой структуры хранится все

Объекты в модуле CGI.pm

CGI-модуль необычен в том смысле, что его можно рассматривать либо как традиционный модуль с экспортируемыми функциями, либо как объектный модуль. Некоторые программы пишутся гораздо легче с п

Сначала, однако, нам нужно создать этот объект явно. Для CGI.pm, как и для многих других классов, метод, который позволяет создавать объекты,— это метод класса

* В отличие от C++ Perl не считает new ключев

Данный метод конструирует и возвращает новый CGI-объект, соответствующий заполненной форме. Этот объект содержит все данные, введенные пользователем в форму. Будучи вызванным без аргументов, ме

Через минуту мы покажем вам эту программу и поясним ее работу. Давайте предположим, что она называется guestbook и находится в каталоге cgi-bin

Затем программа загружает в броузер HTML-форму и, на всякий случай, предыдущие сообщения гостей (в ограниченном количестве), чтобы пользователь мог их просмотреть. Пользователь заполняет форму,

Вот наша программа. Перед тем как разбирать ее поэтапно, вы, возможно, захотите просмотреть программу целиком.

use strict; # установить объявления и взятие в кавычки use CGI qw(:standard); # импортировать сокращения согласно

sub bail ( # функция обработки ошибок

print hi(«Unexpected Error»), p($error), end html;

$CHATNAME, # имя файла гостевой книги $MAXSAVE, # какое количество хранить $TITLE, #

Sentry, # одна конкретная запись ) ;

$TITLE = «Simple Guestbook»;

$CHATNAME = «/usr/tmp/chatfile»; # где все это в системе находится $MAXSAVE =10;

print header, start_html($TITLE), hi ($TITLE);

$cur ” CGI->new(); # текущий запрос if ($cur->param(«message»)) ( # хорошо, мы получили сообщение

• $cur->param(«date», scalar localtime); # установить текущее время Sentries = ($cur); #

# открыть файл для чтения и записи (с сохранением предыдущего содержимого) open(CHANDLE, «+ получить эксклюзивную блокировку на гостевую книгу


# (LOCK_EX == exclusive lock)

flock(CHANDLE, LOCK_EX) || bail(«cannot flock $CHATNAME: $!»);

# занести в $MAXSAVE старые записи (первой — самую новую)

$entry = CGI->new(\*CHANDLE); t передать дескриптор файла по ссылке

push Sentries, $entry;

seek(CHANDLE, 0, 0) 11 bail(«cannot rewind $CHATNAME: $!»);

foreach $entry (Sentries) (

$entry->save(\*CHANDLE); # передать дескриптор файла по ссылке > truncate(CHANDLE, tell(CHANDLE)) || bail(«cannot truncate $CHATNAME: $!»);

close(CHANDLE) || bail («cannot close $CHATNAME: $!»);

print hr, start form; # hr() проводит горизонтальную линию: print p(«Name:», $cur->textfield(

print p(«Message:» $cur->textfield(

-OVERRIDE => 1, # стирает предыдущее сообщение

print p(submit(«send»), reset(«clear»));

print end_form, hr;

print h2(«Prior Messages»);

foreach $entry (Sentries) f

На рис. 19.5 вы видите изображение, которое появляется на экране после запуска этой программы.

Рис. 19.5. Форма простой гостевой книги

Обратите внимание на то, что программа начинается с оператора

Если вы хотите запускать ее с помощью более ранние версии Perl 5, то нужно превратить в комментарий строку

use Fcnti qw(:flock)

и заменить lock_ex в первом вызове flock на z.

Поскольку каждое выполнение программы приводит к возврату HTML-формы в броузер, который обратился к программе, то программа начинается с задания HTML-кода:

print header, start_html($TITLE), hi($TITLE) ;

Затем создается новый CGI-объект:

$cur = CGI->new(); # текущий запрос

if ($cur->param(«message»)) ( # хорошо, мы получили сообщение

$cur->param(«date», scalar localtime); # установить текущее время

Sentries = ($cur); # записать сообщение в массив

Если нас вызывают посредством заполнения и передачи формы, то объект $cur должен содержать информацию о тексте, введенном в форму.

Если нас вызывают не посредством передачи формы, а выполняя щелчок мышью на ссылке Please sign our guestbook, то объект запроса, который мы создаем, будет пуст. Проверка @entries. (Вспомните о том, что мы

Эта функция открывает файл в режиме неразрушающего чтения-записи. Вместо open можно использовать sysopen ().

# нужно импортировать две «константы» из модуля Fcnti для sysopen use Fcnti qw( 0_RDWR 0_CREAT );

sysopen(CHANDLE, $CHATFILE, 0_RDWRI0_CREAT, 0666) || bail «can’t open $CHATFILE: $!»;

Затем мы блокируем файл, как описывалось выше, и переходим к считыванию текущих записей из $ мах save

flock(CHANDLE, LOCK_EX) 11 bail(«cannot flock $CHATNAME: $!»);

while (!eof(CHANDLE) &S Sentries new(\*CHANDLE); # передать дескриптор файла по ссылке

push Sentries, $entry;

Функция eof — встроенная Perl-функция, которая сообщает о достижении конца файла. Многократно передавая в метод

seek(CHANDLE, 0, 0) || bail(«cannot rewind $CHATNAME: $!»);

foreach $entry (Sentries) <

$entry->save(\*CHANDLE); # передать дескриптор файла по ссылке > truncate(CHANDLE, tell (CHANDLE)) || bail(«cannot truncate $CHATNAME: $!»);

close (CHANDLE) || bailC’cannot close $CHATNAME: $!»);

Функции seek, truncate и tell —встроенные Perl-функции, описания ко

Метод save () обеспечивает собственно создание записей. Его можно вызвать здесь как $entry->save, поскольку

Формат записи сохраняемого файла выглядит следующим образом (запись завершается знаком «=», стоящим в отдельной строке):

ИМЯ1=ЗНАЧЕНИЕ1 ИМЯ2=ЗНАЧЕНИЕ2 ИМЯЗ=ЗНАЧЕНИЕЗ

Теперь пора возвратить обновленную форму броузеру и его пользователю. (Это будет, конечно, первая форма, которую он видит, в том случае, если он щелкнул на ссылке Please sig

print hr, start_form; # hr() проводит горизонтальную линию:

Как мы уже упоминали, CGI.pm позволяет нам использовать либо прямые вызовы функций, либо вызовы методов через CGI-объект. В нашей

print pC’Name:», $cur->textfield( -NAME => «name»)) ;

print p(«Message:» $cur->textfield(

-OVERRIDE => 1, # стирает предыдущее сообщение

print p(submit(«send»), reset(«clear»));

print end_form, hr;

* Фактически она представляет собой glob-ссылку, а не ссылку на дескриптор файла, но в данном случае это почти то же самое.

Метод textfieid() возвращает поле ввода текста для нашей формы. Первый из двух приведенных выше вызовов генерирует HTML-код поля в

Компоненты формы, создаваемые модулем CGI.pm, по умолчанию устойчивы: они сохраняют свои значения до следующего вызова. (Но лишь в

NAME=»name» VALUE=»Sam Smith»

Совсем другое дело — второй вызов text field (). Мы не хотим, чтобы

Наконец, к удовольствию пользователя, мы выводим текущий перечень сохраняемых сообщений, включающий, естественно, то, которое он только что передал:

print h2(«Prior Messages»);

foreach $entry (Sentries) <

Как вы, без сомнения, догадываетесь, функция h2 задает HTML-заголовок второго уровня. В остальной части кода мы просто последовате

Пользователи могут работать с этой формой гостевой книги, непрерывно набирая сообщения и нажимая кнопку передачи. Это имитирует электронную доску объявлений, позволяя пользователям видеть новые сообщения друг друга сразу же после их пер

предыдущие значения компонентов формы автоматически сохраняются до следующего вызова. Это особенно удобно при создании многоступенчатых форм — например, тех, которые использ

Поиск и устранение ошибок в CGI -программах

CGI-программы, запускаемые с Web-сервера, функционируют в совершенно иной среде, нежели та, в которой они работают при вызове из командной строки. Конечно, вы всегда должны добиваться,

Помогут вам разобраться в этом сборник часто задаваемых вопросов по CGI и хорошая книга по CGI-программированию. Некоторые из источников перечислены в конце главы.

Вот краткий перечень проблем, часто встречающихся в CGI-программи-ровании. При возникновении почти каждой из них выдается раздражающе-бесполезное сообщение 500 Server Error,

• Если, посылая HTML-код в броузер, вы забыли о пустой строке между HTTP-заголовком (т.е. строкой Content-type)

• Серверу необходим доступ к сценарию с правом чтения и выполнения, поэтому он, как правило, должен иметь режим 0555, Каталог, в котором находится сценарий, сам должен быть выполняемым, поэтому присвойте ему режим доступа 0111, а лучше Сценарий должен быть инсталлирован в соответствующем конфигурации вашего сервера каталоге. В некоторых системах, например, это может быть

Советы по отладке в режиме командной строки приведены в документации на CGI.pm.

• Возможно, в имя файла вашего сценария понадобится вводить определенное расширение, например cgiwivipl. Мы возражаем проти

• Помните: расширение р1 означает, что это Perl-библиотека, а не исполняемый Perl-файл. Не путайте эти понятия, иначе вашей судьбе не позавидуешь. Если у вас безуслов

• Конфигурация вашего сервера требует особого разрешения на выполнение CGI для каталога, в который вы поместил

• Web-сервер не выполняет ваш сценарий при запуске с вашим идентификатором пользователя. Убедитесь в том, что файлы и каталоги, к которым обращается сценарий, открыты для всех пользователей, для которых Web-сервер выполняет сценарии, та

• Всегда запускайте свой сценарий с Perl-флагом -w, чтобы иметь возможность получать предупреждения. Они напра

• Убедитесь, что версии программ и пути к каталогам с Perl и всем используемым вами библиотекам (вроде CGI.pm)

• В начале своего сценария включите режим autoflush для дескриптора файла stdout,

• Проверяйте возвращаемое значение каждого системного вызова, который производит ваша программа, и в случае неудачного исхода выполняйте соответствующее действие.

Perl и Web: не только

Perl используется не только в CGI-программировании. Среди других направлений его применения — анализ ф

Специализированные издательские системы

Коммерческие издательские Web-системы могут сделать трудные вещи легкими, особенно для непрограммистов, но они не столь гибки, как настоящие языки программирования. Без исходного кода в

Perl — идеальный язык для создания специализированных издательских систем, приспособленных под ваши уникальные потребности. С его помощью можно одним махом преобразовать нео

* Perl-интерфейс к графической библиотеке gd Томаса Баутелла содержится в модуле GD.pm,

Самый быстрый, самый дешевый (дешевле бесплатного уже ничего быть не может) и самый популярный Web-сервер в Internet, Apache, мож

Другой способ ускорить выполнение CGI — использовать стандартный модуль CGI::Fast. В отличие от описанного выш

Если Web-сервер у вас работает под Windows NT, вам определенно следует посетить Web-сервер ActiveWare, www.acf

Автоматизация работы в Web с помощью LWP

Ставили ли вы когда-нибудь перед собой задачу проверить Web-документ на предмет наличия «мертвых» ссылок, найти его название или выяснить, какие из его ссылок обновлялись с прошлого чет

* Стандартный дистрибутив Perl версии 5.004 п

Сейчас вы могли бы сделать все это вручную с помощью броузера, но, поскольку графические интерфейсы совершенно не приспособлены для автоматизации программирования, это был бы медленный и

Модули LWP (Library for WWW access in Perl — библиотека для доступа к WWW на Perl)

peri -MLWP::Simple -e «getprint ‘http://www.perl.com/perl/index.html'»

За исключением модуля LWP: :Simple, большинство модулей комплекта LWP

#!/usr/local/bin/peri use LWP;


$browser = LWP::UserAgent->new(); # создать виртуальный броузер $browser->agent(«Mothra/126-Paladium:); # дать ему имя f

# сделать GET-запрос по URL через виртуальный броузер

$webdoc = $browser->request(HTTP::Request->new(GET => $url));

if($webdoc->is success) ( # нашли

print STDOUT «$url: :, $result->title, «\n»;

print STDERR «$0: Couldn’t fetch $url\n»;

Как видите, усилия, потраченные на изучение объектов Perl, не пропали даром. Но не забывайте, что, как и модуль — пользовательский агент (нечто вроде автоматизированного виртуального броузера). Этот объект используется для выдачи за

* Помните, что по Ларри Уоллу три главных достоинства программиста есть Леность, Нетерпение и Гордость.

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

#!/usr/local/bin/peri -w use strict;

my($url, $browser, %saw);

$browser ” LPW::UserAgent->new(); # создать виртуальный броузер f о reach $url ( @ARGV ) (

# выбрать документ через виртуальный броузер

my $webdoc = $browser->request (HTTP: :Request->new (GET => $url).);

next unless $webdoc->is_success;

next unless $webdoc->content_type eq ‘text/html’;

# не могу разобрать GIF-файлы

my $base = $webdoc->base;

# теперь извлечь все ссылки типа . > и foreach (HTML::LinkExtor->new->parse($webdoc-&gt

next unless $tag eq «a» or $tag eq «img»;

foreach $link (values %links) (

> > ) print join(«\n»,sort keys %saw), «\n»;

На первый взгляд все кажется очень сложным, но вызвано это, скорее всего, недостаточно четким пониманием того, как работают различные объекты и их методы. Мы не собираемся здесь давать пояснени

Естественно, о модулях, ссылках, объектах и Web-программировании можно рассказать гораздо больше, чем вы узнали из этой маленькой главы. О CGI-программировании можно написать отдельную

• Файлы документации CGI.pm.

• Библиотека LWP из CPAN.

CGI Programming on the World Wide Web by Shishir Gundavaram (O’Reilly & Associates).

Web Client Programming with Perl by Clinton Wong (O’Reilly & Associates).

HTML: The Definitive Guide by Chuck Musciano and Bill Kennedy (O’Reilly & Associates).

How to Setup and Maintain a Web Site by Lincoln Stein (Addison-Wesley).

CGI Programming in С and Perl by Thomas Boutell (Addison-Wesley).

• Сборник FAQ no CGI Ника Кью.

• Man-страницы: perltoot, perlref, perlmod, perlobj.

1. Напишите программу для создания формы, содержащей два поля ввода, которые при передаче данных формы объединяются.

2. Напишите CGI-сценарий, который определяет тип броузера, делающего запрос, и сообщает что-нибудь в ответ. (Совет: воспользуйтесь переменной среды HTTP_

CGI на Perl. Первые шаги.

Perl является интерпретируемым языком, созданным программистом Лари Уоллом (Larry Wall) для обработки больших текстов и файлов и расшифровывается, как Practical Extraction and Report Language (язык для практического извлечения данных и составления отчетов). С помощью Perl вы, например, можете создать скрипт, который открывает один или несколько файлов, обрабатывает информацию и записывает результаты.

С изобретением World Wide Web, Perl оказался прекрасным средством для взаимодействия с web-серверами через Common Gateway Interface (CGI) — общий интерфейс взаимодействия. Команды Perl могут легко получить данные из формы HTML или другого источника и что-нибудь с ними сделать.

Как Perl обрабатывает данные из форм

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

  • добавить их в текстовый файл,
  • ввести их в базу данных,
  • вставить их в электронное письмо,
  • добавить их в существующую web-страницу,
  • создать новую web-страницу,
  • отобразить их в окне браузера.

Некоторые из этих примеров рассматриваются в нашем уроке.

Как генерируются web-страницы «на лету»

Больше всего впечатляет то, что Perl может быть использован для создания web-страниц «на лету» в ответ на запрос или действие пользователя. Новая страница может быть

  • благодарностью за заполнение формы
  • страницей подтверждения с возможностью редактирования
  • запросом дополнительных данных
  • результатом запроса к базе данных или запроса поиска

Эта возможность обеспечивает истинную интерактивность вашего узла. Такие скрипты позволят web-серверу автоматически реагировать на определенный набор запросов пользователя, предоставляя данные в требуемом пользователем виде.

В чем различие между программой и скриптом?

Перед началом работы с Perl необходимо понять разницу между программой и скриптом. Оба из них используют набор инструкций для выполнения определенного задания, но программа скомпилирована в эффективный двоичный формат, что позволяет ей быстро выполняться на определенной платформе, в то время как скрипт хранится в оригинальном текстовом формате.

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

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

Альтернативы Perl

Существует несколько альтернатив использованию Perl:

  • С, Visual Basic — более традиционные компьютерные языки для обработки вводимых данных. Должны компилироваться под определенную платформу.
  • ActiveX — включение программных компонент, выполняющихся в браузере.
  • JavaScript, VBScript — обеспечивают некоторую интерактивность HTML страниц, которую HTML обеспечить не может.
  • Cold Fusion — сторонняя программа для связи форм с базами данных.
  • PHP/FI — еще одна сторонняя программа для связи форм с базами данных.

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

Что вам требуется, чтобы запустить Perl

Для запуска Perl вашей системе понадобится несколько компонент:

  1. Скрипт, написанный вами или предложенный вам другим, сохраненный в текстовом файле.
  2. Perl интерпретатор. Любой Perl скрипт в первой строке содержит путь к этой программе.
  3. Web-страница с которой будет запускаться этот скрипт. Она может содержать форму или просто ссылку, если скрипт не требует входных данных.
  4. Web-сервер. Взаимодействие между web-страницей и скриптом производится сервером. Поэтому вы должны иметь доступ к web-серверу с возможностью записи и запуска на нем скриптов.

Где взять Perl

Существует много различных мест, где можно получить информацию о последних версиях Perl.

  • Общая информация о Perl — http://www.perl.com/perl/index.html
  • Perl для UNIX — http://www.perl.com/perl/info/software.html
  • Perl для Win32 — http://ntperl.hip.com

Этапы создания скрипта

После того, как вы установили на своем компьютере необходимое ПО, нужно совершить несколько шагов для запуска Perl на вашем узле:

  1. Создать форму для вызова скрипта.
  2. Создать сам скрипт.
  3. Отладить скрипт. Проверить отсутствие ошибок (если это возможно, лучше проверить все возможные пути выполнения программы).
  4. Поместить скрипт на сервер и не забыть дать ему права на выполнение.
  5. Связать скрипт с формой, вставив его имя в параметр action тэга form. Например:

Сохраните файл на диске.

Шаг 2 — Создание скрипта

Предложенный ниже скрипт берет введенные данные, сохраняет их в файле и показывает сообщение, содержащее ссылку на файл с сохраненным именем. Наберите в редакторе текст программы и сохраните в файле testform.pl в каталоге cgi-bin вашего web-сервера. Убедитесь, что первая строка программы содержит правильный путь к программе-интерпретатору (для определения местоположения программы на UNIX воспользуйтесь командой which perl, под Windows выполните поиск файла perl.exe). Убедитесь также, что путь к выходному файлу является корректным путем к области хранения документов web-сервера. В заключение исправьте URL на адрес вашего сервера.

Шаг 3 — Тестирование скрипта

Проверив скрипт визуально на наличие ошибок — отсутствие «;» в конце строк, наличие непарных скобок и кавычек и т.п., запустите скрипт для проверки прямо из командной строки, перейдя предварительно в каталог cgi-bin. Вот некоторые примеры того, как это делается:

Если в скрипте содержатся ошибки, то вы увидите сообщение типа

В этом случае проверьте текст около указанной строки. Помните, что причина ошибки может быть выше на несколько, иногда достаточно много строк. Исправленный скрипт сохраните, и тестируйте так до тех пор, пока он не выдаст корректных выходных данных:

Шаг 4 — Тестирование скрипта с формой

Если скрипт работает сам по себе, вы можете оттестировать его с формой:

  1. Убедитесь, что web-сервер запущен.
  2. Запустите ваш браузер.
  3. Наберите URL по которому находится ваша форма (обратите внимание, что строка должна начинаться с http://, а не с file://.
  4. Введите ваше имя в поле формы и нажмите кнопку «Зарегистрировать».
  5. Вы должны увидеть сообщение вроде этого:

Спасибо, что заполнили форму
Нажмите сюда, чтобы увидеть Ваш ввод.

Это и есть страница, сгенерированная скриптом «на лету». Если вы получили сообщение об ошибке сервера, проверьте правильность расположения скрипта и правильность значения параметра action в тэге form.

  1. Если вы видите правильно сгенерированную страницу, нажмите на ссылку. Вы должны будете увидеть новую страницу, созданную скриптом примерно в таком виде:

Если вы не видите этого, проверьте правильность пути в переменной $targetfile и правильность URL в предпоследней строке скрипта. В противном случае форма и скрипт правильно работают вместе. Вы успешно создали первое web-приложение.

Далее мы рассмотрим четыре части созданного нами скрипта более внимательно.

Обсуждение: Настройка скрипта

Как уже было сказано, первая часть скрипта содержит настройки, включающие в себя несколько элементов. Первая строка определяет путь к программе-интерпретатору:
#!/usr/local/bin/perl для UNIX
или
\Program Files\Perl5\perl.exe для Win32

Также в начале скрипта вы, для удобства, можете разместить комментарий о том, для чего предназначен этот скрипт.

Комментарии могут располагаться в любом месте программы и начинаются с символа #:
или

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

Все обычные переменные в Perl начинаются с символа $. Существует много других видов переменных, таких как массивы и т.п.

Все строки программы кроме первой и комментариев должны заканчиваться на «;».

Обсуждение: Чтение данных из формы

Теперь необходимо «считать» введенные пользователем данные в переменные Perl. После того как пользователь нажмет кнопку Submit в форме браузер посылает серверу имя скрипта и данные, взятые из формы. Данные передаются скрипту на стандартный вход.

Предположим, что форма содержит следующие поля:

Имя поля в форме

Имя, определенное параметром name=»xxx» в тэге поля

Данные пользователя

user_name

Andy Novikov

Компания:

co_name

TeleSputnik

Телефон:


phone

(812) 123-45-67

В этом случае данные будут посланы скрипту в следующем формате:
user_name=Andy+Novikov&co_name=TeleSputnik&phone=(812)+123-45-67

Perl скрипт должен разобрать эту строку по частям и сохранить в переменных для дальнейшей обработки. Строки, производящие эти действия достаточно стандартны:

Эта строка читает данные со стандартного входа и помещает их в переменную $buffer. Длина строки передается скрипту через переменную окружения CONTENT_LENGTH.

Как только данные помещены в переменную $buffer вы можете разбить их на отдельные переменные с соответствующими им значениями:

Теперь мы получили массив @pairs со следующими строковыми переменными:
[1] user_name=Andy+Novikov
[2] co_name=TeleSputnik
[3] phone=(812)+123-45-67

Теперь нам необходимо разбить эти строки на пары параметр-значение:

Таким образом вы получаете массив переменных, индексом в котором является значение параметра name поля формы, а значением — данные, введенные в соответствующее поле.

Обсуждение: Что делать с данными?

Следующим шагом является обработка данных. Но как? Все зависит от того, что вы хотите сделать с данными. В нашем примере мы на основе полученных данных создаем новый HTML документ. Нише мы рассмотрим несколько простых примеров того, что можно сделать с полученными данными. Обратите внимание, что мы не предпринимаем попыток проверить правильность (validate) содержимого полей. Хотя в реальных скриптах это является желательным, а иногда и необходимым действием.

Обсуждение: Запись в файлы

Одно из действий, которое вы можете совершить над данными, это записать их в файл. Perl предоставляет набор функций для открытия, обработки и закрытия файлов. Таким образом вы можете создать новый HTML документ, добавить данные в уже существующий HTML документ или сохранить данные в текстовом файле для дальнейшей обработки.

Функция открытия файла выглядит следующим образом:

HANDLE является любым временным именем, который вы будете использовать как идентификатор файла при проведении операций. Как только файл открыт, вы можете писать в него, используя функцию print:

После завершения операций с файлом необходимо его закрыть:

После этого все записанные данные будут сохранены на диск.

Перед осуществлением запись в файл, вы должны убедиться, что web-сервер имеет доступ к директории, в которой находится файл и имеет права на запись в этот файл.

Обратите внимание: функция close должна располагаться как можно ближе к последней функции записи в файл. Это обусловлено тем, что web-сервер выполняется в многопользовательской среде, и скрипт может запускаться одновременно несколькими пользователями. При открытии файла на запись он (файл) блокируется и другие экземпляры скрипта не смогут его открыть, что вызовет задержку в выполнении запроса.

Пример: Создание новой HTML страницы

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

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

Все входные данные из формы содержатся в переменных $input. При печати такие переменные должны выноситься за кавычки и отделяться запятыми.

Пример: Добавление в конец файла

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

Пример: Добавление в середину существующего файла

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

Этот комментарий будет служить нам меткой места, в которое нужно вставлять новые данные. Данный пример содержит не совсем изящное решение, но прост в реализации и понимании. Он использует временный файл, хотя можно обойтись и без него:

Пример: Отправка данных по e-mail

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

Для этого вам потребуется программа посылки почты с интерфейсом командной строки. Под UNIX это может быть sendmail или mail. В данном примере данные посылаются с помощью программы sendmail. Вместо записи в файл мы используем запись в специально открытый канал (pipe):

Обсуждение: Создание web-страниц «на лету»

Последней важной частью Perl скрипта является посылка результата обратно пользователю. Это достигается тем же print, но без идентификатора файла или канала. Все, что печатается на стандартный выход формирует текущий документ в окне браузера. Например:

Обратите внимание на первую строку. Эта строка содержит информацию о типе возвращаемых данных. Двойной перевод стоки при этом обязателен. Эта страница будет возвращена пользователю почти сразу после нажатия им кнопки Submit.

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

Perl и CGI программы

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

Создание CGI скрипта для примера на Perl

В программе Notepad++ создайте новый файл и введите следующие строки:

После, сохраните этот файл с расширением .pl (тип файла: Perl source file).

Первая строка данного кода, указывает путь к интерпретатору CGI скриптов. Остальные, непосредственно исполняемый код.

Загрузка CGI скриптов на сервер

Мы воспользуемся популярным FTP клиентом FileZilla (можно скачать здесь). Войдите в вашу учетную запись на FTP сервере (как это сделать, можно узнать здесь). В правой панели перейдите в каталог cgi-bin вашего домена (путь будет выглядеть так: /domains/your-domen.ru/html/cgi-bin/).

В верхнем меню, перейдите в Передача – Тип передачи, и убедитесь что установлен режим ASCII .

После этого, в левой панели, на вашем файле скрипта нажмите правую кнопку мыши и выберите Загрузить на сервер. Файл будет загружен на сервер, далее, уже на правой панели на файле скрипта нажмите правую клавишу мыши и выберите Изменить атрибуты. Необходимо проверить права на ваш CGI -скрипт. Они должны быть установлены в значение -rwxr-xr-x или 755.

Подробнее о правах доступа

Значение прав доступа файла определяет тех кто имеет право на редактирование и исполнение файлов. Права доступа файла определяются в CHMOD файле. Права доступа можно изменить большинством популярных клиентов FTP или через, встроенный в панель управления, Web FTP.

Наиболее, часто используемые, уровни доступа к файлам:

Ошибки работы скрипта

Для корректной работы, необходимо проверять скрипты перед тем, как помещать их на веб-сервер. Если в скрипте есть ошибки, то, запустив скрипт в unix shell, Вы сможете понять чем недоволен интерпретатор Perl .

Ошибка 403 Если при обращении к скрипту Вы видите сообщение об ошибке 403, это значит, что на скрипт установлены некорректные права доступа. На CGI -скрипты необходимо установить атрибут исполнения (права доступа 755 или -rwxr-xr-x).

CGI-программы, использование Perl

Установка модулей Perl

Устанавливать модули Perl лучше всего используя CPAN shell. Необходимо зайти в unix shell и набрать команду:

После этого можно установить любой модуль командой

Рекомендуем при первой настройке CPAN shell выбрать один из серверов-зеркал, перечисленных в категории «Europe/Russia».

В случае необходимости вы можете отредактировать конфигурационный файл — /home/ uXXXXX/.cpan/CPAN/MyConfig.pm , где uXXXXX номер вашей виртуальной площадки.

Важно:

При первичном конфигурировании CPAN shell на вопрос: надо ответить:

Именно в этом случае все необходимые модули будут корректно устанавливаться в ваш домашний каталог.

Установка модулей Perl с помощью Makefile.PL

К сожалению, не все модули можно установить с помощью CPAN, обладая ограниченным правами пользователя площадки. В следующем примере мы рассмотрим установку модуля String::CRC32.

Сначала найдем модуль на сайте http://search.cpan.org/, введя в строку поиска название этого модуля. Далее выбираем вторую ссылку из самого первого результата поиска:

копируем url на модуль из ссылки Download;

загружаем архив на площадку:

распаковываем полученный архив:

выполняем следующие команды:

Чтобы использовать модуль, добавьте в скрипт следующую строку

Классификация ошибок

Ошибки делятся на шесть основных категорий (перечислены по степени сложности):

Ошибки формата файла

В операционных системах Unix, Windows для завершения строки используются разные символы.

Это может вызвать проблемы, если вы редактируете свою программу в операционной системе одного типа, а затем запускаете ее в другой ОС. Иными словами, если вы создаете и (или) редактируете свои программы на Windows, а ваш Internet-провайдер использует Web-сервер на базе Unix, необходимо удостовериться, что файл вашей программы сохранялся с соответствующими разделителями строк.

Один из простых способов сделать это — открыть файл на своем Web-сервере и посмотреть, есть ли в конце, каждой строки какие-нибудь странные символы.

Только надо быть уверенным, что ваш редактор показывает специальные символы.

Например, редактор vi их показывает, а less — нет.

Многие современные текстовые редакторы предусматривают возможность задавать тип разделителей строк, поэтому проверьте, сохраняете ли вы файл в формате, подходящем для вашего Web-сервера.

Если вы пересылаете файлы на свой Web-сервер с помощью FTP, убедитесь в том, что ваш FTP-клиент настроен на пересылку файлов в текстовом (ASCII), а не в двоичном (binary) режиме. Во многих случаях это гарантирует автоматическое преобразование разрывов строк и помогает избежать проблем.

Ошибки доступа к файлам и интерпретатору Perl

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

Первая строка вашего скрипта должна указывать путь к интерпретатору Perl:

Убедитесь в отсутствии символа возврата каретки (код 0x0D) , в строках скрипта должен быть только символ перевода строки (код 0x0A). Права для CGI скриптов, а также для директории, содержащей скрипты, должны быть выставлены «-rwxr-xr-x», например такой командой:

Синтаксические ошибки

В Perl есть специальное средство, которое позволяет из командной строки проверять программу на наличие синтаксических ошибок, В Unix или Windows (с использованием командного процессора DOS) это делается путем ввода следующей строки на приглашение ОС:

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

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

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

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

Ошибки конфигурации

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

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

Ошибки формата вывода

Последний тип ошибок, в отсутствии которых нужно убедиться перед вызовом программы из браузера, составляют ошибка формата вывода. Перед всей выходной информацией CGI-программы, предназначенной для Web-браузера посетителя ( т.е. перед всем, что выводится в STDOUT), должен идти правильный HTTP-заголовок, иначе будет сгенерирована ошибка «500 Server Error».

Например, если вы генерируете HTML-страницу, то первым выполняемым программой оператором print должен быть следующим:

Этот оператор выводит HTTP-заголовок, показывающий, что следующая за ним информация будет содержать HTML-страницу. Если вы не забудете в своей программе поставить эту строку (или соответствующий HTTP-заголовок при выводе не HTML-страницы) перед всеми остальными операторами print, то избежите любых ошибок формата вывода.

Ошибки в логике программы (использование Perl-отладчика)

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

Запуск отладчика


Если вы используете Perl под Unix или Windows (с командным процессором DOS), то отладчик запускается путем выполнения программы следующим образом:

Флаг -d дает Perl указание включить отладчик. Вы получите несколько сообщений, за которыми следует приглашение отладчика, выглядящее примерно так:

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

Как получить помощь

Команды отладчика состоят из одного или двух символов, за которыми иногда следует необязательный или обязательный аргумент.

Полный список этих команд можно получить путем ввода буквы h на приглашении отладчика и нажатия клавиши Enter.

Пошаговое прохождение программы

Основные команды отладчика позволяют обрабатывать программу по одной строке за раз. Если ввести на приглашение отладчика команду s и нажать клавишу Enter, то Perl выполнит следующую строку программы и выдаст новое приглашение.

Если ввести команду n и нажать клавишу Enter, то Perl сделает то же самое, но пропустит вызовы подпрограмм. (Команда s вводит вас в подпрограмму). Если вы использовали любую из этих команд хотя бы один раз, то для повторного ее вызова нужно просто нажать клавишу Enter.

Просмотр значений

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

Ввод команды X и имени переменной (без спецификатора типа ( S, % или @) в начале) и последующее нажатие клавиши Enter заставят Perl выдать список переменных (используемых имя данной переменной) с их значениями в удобном формате. Это позволит вам увидеть содержимое массивов и ассоциативных массивов.

Можно также применить стандартный оператор print, например print $var__name. В принципе, по приглашению отладчика можно использовать любой допустимый оператор языка Perl.

Поиск строк

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

Эта команда заставит отладчик вывести на экран строку 180. Опустив номер строки, на экран можно вывести группу строк. Можно также вывести диапазон строк:

С помощью команды w можно вывести группу строк с текущей строкой или заданную строку в середине группы, чтобы поместить конкретную строку в контекст:

Эта команда выводит на экран группу строк со строкой 180 в середине. Если номер строки не указан, то используется номер текущей строки. Второй способ перехода в определенную точку программы — это стандартный поиск по образцу:

Эта команда ищет в программе следующий экземпляр переменной Scount и переходит в строку, которая его содержит. (Закрывающую косую можно опустить).

Точки останова

Если вы не хотите передвигаться по программе пошагово, то, чтобы попасть в нужную строку, можете установить в нее точку останова. Точка останова даст Perl указание выполнить программу до этой строки, затем остановиться и ожидать вашей следующей команды:

Эта команда заставляет программу сделать паузу, когда она дойдет до строки 180. (Для запуска программы или возобновления ее после прерывания служит команда с). Вы можете также задать условие, которое должно быть выполнено для того, чтобы программа прервалась. Например:

Следующая команда заставит программу прерваться на строке 180, если значение переменной Scount больше 5.

Удаление контрольных точек производится с помощью команд d (удаляется одна контрольная точка) и D (удаляются все контрольные точки):

Выполнение дополнительных команд

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

Эта команда заставит отладчик вывести текущее значение переменной $count непосредственно перед выполнением строки 180.

Отмена действий производится командой А (она отменяет все действия, которые вы установили для программы).

Имитация CGI-вызова

Perl-отладчик можно использовать с CGI-npoграммой. CGI-программы выполняются в удаленном режиме, поэтому доступа к отладчику не имеется. Тем не менее можно сымитировать CGI-вызов из самой программы, с тем чтобы с помощью отладчика следить за проблемами, возникающими только при CGI-вводе.

Установка переменных среды

Если ваша программа использует какие-либо переменные CGI-среды , то вы сможете модифицировать ассоциативный массив %ENV (Такие изменения носят временный характер и действуют на программу только тогда, когда она работает).

Это позволяет ввести в начало программы несколько строк, с помощью которых устанавливаются те переменные среды, которые она использует. Например:

Имитация ввода данных формы

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

При использовании метода POST ситуация усложняется лишь незначительно. Указанный метод передает в программу данные формы с помощью STDIN и задает количество передаваемых данных с помощью переменной среды CONTENT_LENGTH. Следовательно, для сбора данных можно использовать следующую CGI-программу:

Эта программа считает данные формы из STDIN, а потом запишет их в файл. Затем вы должны добавить в свою CGI-программу следующие строки:

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

Эти строки превращают запрос POST в запрос GET и считывают содержимое файла данных формы в переменную среды QUERY_STRING.

Как увидеть невидимое

Очень неприятен тот факт, что при выявлении логических ошибок в CGI-программе почти всегда генерируется сообщение «500 Server Error», которое ничего не скажет о происшедшем. Если программа генерирует ошибку «500», а вы не знаете почему, самый простой способ выявить проблему — заставить свой браузер вывести сообщение об ошибке.

Для этого нужно поставить следующие две строки в начало программы (сразу после строки #!/usr/bin/perl:

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

Вторая строка сообщает браузеру о том, что все выводимое вашей программой в STDOUT должно рассматриваться как обычный текст и отображаться как таковой. Если эта строка есть, то при следующем вызове программы вы должны увидеть сообщение, которое приводит к выдаче сообщения об ошибке «500».

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

Так, если значение переменной $status должно быть равным 1, а вы подозреваете, что оно будет задано неверно, вставьте в точку, где эта переменная должна быть равной 1, следующую строку:

При следующем вызове программы вы увидите значение переменной $status у себя в браузере и сможете определить, в нем ли заключается причина возникшей проблемы. (По сути, вы выполняете в дистанционном режиме те же действия, которые обычно производятся в отладчике).

При более сложных ошибках этот метод работает достаточно медленно, но в отличие от других методов он все же работает.

Если ваша программа выполняет несколько функций, а проблема связана только с одной из них, вставьте в начало сегмента, вызывающего эту проблему, строку HTTP — заголовка. Это позволит вам пройти по нормальным сегментам как обычно и настроить все для обработки сегмента с ошибкой.

CGI.pm — библиотека CGI для Perl 5

Версия 2.56, 13.09.1999, Л. Штейн. Перевод 13.02.2000, П. Шмидт.

Содержание

Загрузка и установка

  • Загрузка архива gzip tar (для Unix)
  • Загрузка архива pkzip (для Windows)
  • Загрузка архива sit (для Macintosh)
  • Загрузка только модуля CGI (несжатого)

Текущая версия программного обеспечения может быть всегда загружена с копии владельца этого документа, поддерживаемой на http://stein.cshl.org/WWW/software/CGI/.

Этот пакет требует Perl 5.004 или выше. Ранние версии Perl могут работать, но CGI.pm не тестировался с ними. Если вам действительно невтерпеж, отредактируйте исходный код, чтобы удалить строку, которая говорит «требуется 5.004» («require 5.004»), но не удивляйтесь, если вы натолкнетесь на проблемы.

Если вы используете систему Unix, вам следует сделать установку Perl для себя. Направляйтесь в каталог, содержащий CGI.pm, и наберите следующие команды:

Возможно, вам придется быть администратором (root), чтобы сделать следующий шаг.

Это создаст два новых файла в вашей библиотеке Perl. CGI.pm — главный файл библиотеки. Carp.pm (в подкаталоге «CGI») содержит некоторые необязательные полезные подпрограммы для написания хорошо форматированных сообщений об ошибках в журналах (log) вашего сервера. Смотрите man-страницу Carp.pm более детально.

Если вы получаете сообщения об ошибках, когда вы пытаетесь устанавливать, тогда вы:

  1. либо запускаете версию Perl для Windows NT или Macintosh, которая не имеет встроенной в него программы make или MakeMaker.
  2. либо имеете старую версию Perl. Обновите до 5.004 или выше.

В первом случае не паникуйте. Вот рецепт, который работает (команды даны в форме MS-DOS/Windows):

Измените этот рецепт, если ваша библиотека Perl имеет другое местонахождение.

Для пользователей Macintosh просто перетащите файл, называющийся CGI.pm, в папку, где хранятся ваши другие файлы .pm для Perl. Также перетащите папку, называющуюся «CGI».

Если вы не имеете достаточных привилегий для установки в /usr/local/lib/perl5, вы все же можете использовать CGI.pm. Измените рецепт установки следующим образом:

Замените /home/your/private/dir полным путем в каталог, в который вы хотите, чтобы библиотека была помещена. Теперь начинайте ваши скрипты CGI с преамбулы вроде следующей:

Не забудьте заменить /home/your/private/dir подлинным местонахождением CGI.pm.

Функционально-ориентированное использование в сравнении с объектно-ориентированным

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

Оператор use загружает определения CGI.pm и импортирует набор «:standard» определений функций. Потом мы делаем вызовы различных функций, таких как header() , чтобы сгенерировать заголовок HTTP, start_html() , чтобы воспроизвести верхнюю часть документа HTML, h1() , чтобы воспроизвести заголовок первого уровня и так далее.

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

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

Тот же скрипт, написанный, используя объектно-ориентированный стиль, выглядит следующим образом:

Объектно-ориентированный режим имеет также преимущество потребления несколько меньшего количества памяти, чем функционально-ориентированный стиль кодирования. Это может иметь значение для пользователей постоянных интерпретаторов Perl, таких как mod_perl.

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

Создание нового объекта CGI

Самое основное использование CGI.pm — добраться до параметров запроса, представленного вашему скрипту. Чтобы создать новый объект CGI, который содержит параметры переданные вашему скрипту, помещайте следующее наверху ваших программ CGI на Perl:

В объектно-ориентированном мире Perl 5, этот код вызывает метод new() класса CGI и сохраняет новый объект CGI в переменной, названной $query. Метод new() делает всю грязную работу по грамматическому разбору параметров скрипта скрипта и переменных окружения и сохраняет свои результаты в новом объекте. Теперь вы будете делать вызовы методов, используя этот объект, чтобы добираться до параметров, генерировать элементы формы и делать другие полезные вещи.

Альтернативная форма метода new() позволяет вам читать параметры скрипта из ранее открытого указателя файла:

Указатель файла может содержать URL-закодированную строку запроса или может быть рядом разделенных символами новой строки пар ЯРЛЫК=ЗНАЧЕНИЕ. Это совместимо с методом save(). Это позволяет вам сохранить состояние скрипта CGI в файл и перезагрузить его позднее. Также возможно сохранять содержимое нескольких объектов запросов в один и тот же файл, как внутри одиночного скрипта так и на период времени. Вы можете затем перезагрузить множество записей в массив объектов запросов чем-то вроде следующего:

Вы можете делать простые базы данных таким образом или создать гостевую книгу. Если вы — пурист Perl, вы можете передавать ссылку на glob указателя файла вместо имени указателя файла. Это «официальный» способ передавать указатели файлов в Perl 5:

(Если вы не знаете, о чем я говорю, тогда вы — не пурист Perl, и вам не нужно беспокоиться об этом.)

Если вы используете функционально-ориентированный интерфейс и вы хотите инициировать состояние CGI из указателя файла, способ сделать это — использование restore_parameters() . Он будет (пере)инициировать объект CGI по умолчанию из обозначенного указателя файла.

Вы можете инициировать объект CGI из ссылки на ассоциативный массив. Значения могут быть как одно- так и многозначными:

Вы можете инициировать объект CGI, передавая строку запроса в стиле URL в метод new(), как здесь:

Или вы можете клонировать объект CGI из существующего. Список параметров клона будет идентичным, но другие поля, такие как autoescaping — нет:

Эта форма также позволяет вам создавать объект CGI, который изначально пуст:

Смотрите продвинутые приемы за большей информацией.

Вызов списка ключевых слов из запроса

Если скрипт был вызван, как результат поиска , синтаксически разобранные ключевые слова могут быть получены методом keywords(). Этот метод вернет ключевые слова, как массив Perl.

Вызов имен всех параметров, переданных в ваш скрипт

Если скрипт был вызван со списком параметров (например, «имя1=значение1&имя2=значение2&имя3=значение3»), метод param() вернет имена параметров, как список. Для обратной совместимости этот метод будет работать, даже если скрипт был вызван, как скрипт : в этом случае будет возвращен одиночный параметр, названный ‘keywords’.


Вызов значения(ий) именованного параметра

Передайте методу param() один аргумент, чтобы вызвать значение именованного параметра. Если параметр многозначен (например, из множества выбора в списке с возможностью прокрутки), вы можете запросить на получение массива. Иначе метод вернет одно значение.

Как и для версии 1.50 этой библиотеки, возвращаемый массив имен параметров будет в том же порядке, в котором браузер послал их. Хотя это и не гарантирует идентичность порядку, в котором параметры были определены в заполняемой форме, обычно это так.

Установка значения(ий) именованного параметра

Это устанавливает значение для именованного параметра ‘фу’ в одно или более значений. Эти значения будут использоваться для инициации элементов формы, если вы так пожелаете. Заметьте, что это единственный способ насильственно изменить значение поля формы после его предыдущей установки.

Второй пример показывает альтернативный стиль вызова функции «с именованными параметрами», который принят многими методами CGI. Смотрите вызов функций CGI, которые принимают множество аргументов для объяснения этого стиля.

Присоединение параметра

Это добавляет значение или список значений к именованному параметру. Значения присоединяются к концу параметра, если он уже существует. Иначе параметр создается.

Удаление именованного параметра совсем

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

Удаление всех параметров

Это удаляет все параметры и оставляет вас с пустым объектом CGI. Это может быть полезно, чтобы восстановить все установки по умолчанию, произведенные методами, генерирующими элементы формы.

Импортирование параметров в пространство имен

Это импортирует все параметры в заданное пространство имен. Например, если были параметры, названные ‘foo1’, ‘foo2’ и ‘foo3’, после исполнения $query->import_names(‘R’) , переменные @R::foo1, $R::foo1, @R::foo2, $R::foo2, и тому подобные удобно появятся среди существующих. Так как CGI не имеет пути узнать, ожидаете ли вы много- или однозначный параметр, он создает две переменных для каждого параметра. Одна, массив, содержит все значения, а другая — скаляр, содержащий первый член массива. Используйте ту, которая уместна. Для списков ключевых слов (a+b+c+d), будет создана переменная @R::keywords.

Если вы не указываете пространство имен, этот метод предполагает пространство имен «Q».

Необязательный второй аргумент import_names, если он присутствует и ненулевой, удалит содержимое пространства имен перед загрузкой в него. Это может быть полезно для окружений, таких как mod_perl, из которых скрипт не выходит после обработки запроса.

Предупреждение: не импортируйте в пространство имен ‘main’. Это представляет крупный риск безопасности, так как злые люди могут тогда использовать эту особенность для переопределения центральных переменных, таких как @INC. CGI.pm выйдет с ошибкой, если вы попытаетесь сделать это.

Прямой доступ к списку параметров

Если you need access to the parameter list in a way that isn’t covered by the methods above, вы можете obtain a direct reference to it by calling the param_fetch() method with the name of the parameter you want. This will return an array reference to the named parameters, which you then can manipulate in any way you like.

Вы можете call param_fetch() with the name of the CGI parameter, or with the -name argument, which has the same meaning as elsewhere.

Fetching the Parameter List as a Hash

Many people want to fetch the entire parameter list as a hash in which the keys are the names of the CGI parameters, and the values are the parameters’ values. The Vars() method does this. Called in a scalar context, it возвращает the parameter list as a tied hash reference. Changing a key changes the value of the parameter in the underlying CGI parameter list. Called in an array context, it возвращает the parameter list as an ordinary hash. This allows you to read the contents of the parameter list, but not to change it.

When using this, the thing you must watch out for are multivalued CGI parameters. Because a hash cannot distinguish between scalar and array context, multivalued parameters will be returned as a packed string, separated by the «\0» (null) character. You must split this packed string чтобы get at the individual values. This is the convention introduced long ago by Steve Brenner in his cgi-lib.pl module for Perl version 4.

Если вы желаете использовать Vars(), как функцию, импортируйте набор вызовов функций :cgi-lib (смотрите также раздел про совместимость с CGI-LIB).

Возвращение ошибок CGI

Ошибки can occur while processing user input, particularly when processing uploaded files. When these errors occur, CGI will stop processing and return an empty parameter list. Вы можете test for the existence and nature of errors using the cgi_error() function. The error messages are formatted as HTTP status codes. Вы можете either incorporate the error text into an HTML page, or use it as the value of the HTTP status:

Когда вы используете функционально-ориентированный интерфейс (смотрите следующий раздел), ошибки могут встречаться только, когда вы в первый раз вызываете param(). Будьте готовы к этому!

Сохранение текущего состояния формы

Сохранение состояния в файл

This writes the current query out to the file handle of your choice. The file handle must already be open and be writable, but other than that it can point to a file, a socket, a pipe, or whatever. The contents of the form are written out as TAG=VALUE pairs, which can be reloaded with the new() method at some later time. Вы можете write out multiple queries to the same file and later read them into query objects one by one.

Если вы желаете использовать этот метод method from the function-oriented (non-OO) interface, the exported name for this method is save_parameters() . Смотрите продвинутые приемы за большей информацией.

Сохранение состояния in a Self-Referencing URL

Этот вызов возвращает a URL that, when selected, reinvokes this script with all its state information intact. Это может быть полезно, когда вы хотите to jump around within a script-generated document using internal anchors, but don’t want to disrupt the current contents of the form(s). Смотрите продвинутые приемы для примера.

If you’d like to get the URL without the entire query string appended to it, use the url() method:

Получение URL скрипта

url() возвращает URL скрипта в ряде форматов. Вызванный без каких-либо аргументов, он возвращает полную форму URL, включая имя хоста и номер порта

Вы можете модифицировать этот формат следующими именованными аргументами:

-absolute

Если true, вырабатывает абсолютный URL, т.е.

-relative

Вырабатывает относительный URL. Он полезен, если вы хотите вызвать ваш скрипт заново с другими параметрами. Например:

-full

Вырабатывает полный URL точно так же как, если бы он был вызван без каких-либо аргументов. Он перекрывает аргументы -relative и -absolute.

-path,-path_info

Приклепляет дополнительную информацию о пути к URL. Он может комбинироваться с -full, -absolute или -relative. -path_info предусмотрен как синоним.

-query (-query_string)

Приклепляет строку запроса к URL. Он может комбинироваться с -full, -absolute или -relative. -query_string предусмотрен как синоним.

Смешивание параметров POST и URL

It is possible for a script to receive CGI parameters in the URL as well as in the fill-out form by creating a form that POSTs to a URL containing a query string (a «?» mark followed by arguments). Метод param() всегда будет будет возвращать содержимое POST заполняемой формы, игнорируя строку запроса URL. Чтобы вернуть параметры URL, вызывайте метод url_param(). Используйте его тем же способом, что и param(). Главное отличие в том, что он позволяет вам читать параметры, но не установливать их.

Under no circumstances will the contents of the URL query string interfere with similarly-named CGI parameters in POSTed forms. Если вы попытаетесь смешать строку запроса URL с a form submitted методом GET, результаты не будут теми, которые вы ожидаете.

Вызов функций CGI, которые принимают множество аргументов

In versions of CGI.pm prior to 2.0, it could get difficult to remember the proper order of arguments in CGI function calls that accepted five or six different arguments. As of 2.0, there’s a better way to pass arguments to the various CGI functions. In this style, you pass a series of name=>argument pairs, like this:

The advantages of this style are that you don’t have to remember the exact order of the arguments, and if you leave out a parameter, it will usually default to some reasonable value. If you provide a parameter that the method doesn’t recognize, it will usually do something useful with it, such as incorporating it into the HTML tag as an attribute. Например if Netscape decides next week to add a new JUSTIFICATION parameter to the text field tags, вы можете start using the feature without waiting for a new version of CGI.pm:

This will result in an HTML tag that looks like this:

Parameter names are case insensitive: вы можете использовать -name, or -Name or -NAME. You don’t have to use the hyphen if you don’t want to. After creating a CGI object, call the use_named_parameters() method with a nonzero value. This will tell CGI.pm that you intend to use named parameters exclusively:

Actually, CGI.pm only looks for a hyphen in the first parameter. So вы можете leave it off subsequent parameters if you like. Something to be wary of is the potential that a string constant like «values» will collide with a keyword (and in fact it does!) While Perl usually figures out when you’re referring to a function and when you’re referring to a string, you probably should put quotation marks around all string constants just to play it safe.

Параметры HTML/HTTP, которые содержат внутренние дефисы, такие как -Content-language могут быть passed by putting quotes around them, or by using an underscore for the second hyphen, например -Content_language .

The fact that you must use curly <> braces around the attributes passed to functions that create simple HTML tags but don’t use them around the arguments passed to all other functions has many people, including myself, confused. As of 2.37b7, the syntax is extended to allow you to use curly braces for all function calls:

Создание заголовка HTTP

Создание стандартного заголовка для виртуального документа

Это распечатывает необходимый HTTP Content-type: заголовок и строку бланка реквизита под ним. Если не определен параметр, он по умолчанию ‘text/html’.

Расширенная форма этого метода позволяет вам определять код состояния и сообщение, передаваемые назад в браузер:

Это предоставляет браузеру код состояния 204 (Нет ответа). Подобающе ведущие себя браузеры не предпринимают никаких действий, просто остаются на текущей странице. (Это предназначено для скрипта, который делает некоторую обработку, но не нуждается в представлении каких-либо результатов, или для скрипта, вызванного, когда пользователь щелкнул на пустой части активной карты изображения (clickable image map).)

Распознаются несколько других именованных параметров. Здесь искусственный пример, который использует их все:

Некоторые браузеры, такие как Internet Explorer, кэшируют выходную информацию скриптов CGI. Другие, такие как Netscape Navigator, — нет. Это ведет к раздражению и несовместимому поведению, когда переходишь от одного браузера к другому. Вы можете заставить поведение быть совместимым, используя параметр -expires. Когда вы определяете абсолютный или относительный интервал истечения этим параметром, браузеры и прокси-серверы будут кэшировать выходную информацию скрипта до указанного срока истечения. Все следующие формы действительны для поля -expires:

Когда вы используете -expires, скрипт также генерирует корректный штамп времени для сгенерированного документа, чтобы убедиться в том, что ваши часы и часы браузера согласованы. Это позволяет вам создавать документы, которые надежно кэшируются на короткие периоды времени.

CGI::expires() — статический вызов функции, используемой для внутренних нужд, которая обращает относительные временные интервалы в даты HTTP. Вы можете вызывать ее непосредственно, если желаете.

Параметр -cookie генерирует заголовок, который говорит браузерам Netscape возвращать «magic cookie» в течение всех последующих транзакций с вашим скриптом. HTTP cookies имеют специальный формат, который включает интересные атрибуты, такие как срок истечения. Используйте метод cookie(), чтобы создавать и возвращать cookies сессии. Значение этого параметра может быть или скалярным значением или ссылкой на массив. Вы можете использовать последний, чтобы генерировать множество cookies. (Вы можете использовать псевдоним -cookies для читабельности.)

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

Вам понадобится использовать это, если:

  1. Вы используете Microsoft Internet Information Server.
  2. Вам нужно создать небуферизированный вывод, например, для использования в скрипте «server push».
  3. Вам нужно воспользоваться расширениями HTTP, не поддерживаемыми вашим сервером.

Смотрите использование скриптов NPH за большей информацией.

Другие поля заголовка

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

Вы можете использовать его, чтобы воспользоваться новыми полями заголовка HTTP, не дожидаясь следующего выпуска CGI.pm.

Создание заголовка для запроса переадресации

Это генерирует запрос переадресации для удаленного браузера. Он немедленно перейдет на указанный URL. Вам следует выйти вскоре после этого. Больше ничего не будет демонстрироваться.

Вы можете добавить ваши собственные заголовки к этому, как и в методе header().

Вам следует всегда использовать абсолютные или полные URL в запросах переадресации. Относительные URL не будут работать корректно.

Альтернативный синтаксис для redirect() таков:

Параметр -location дает URL места назначения. Вы можете также использовать -uri или -url, если предпочитаете.

Параметр -nph, если он ненулевой, говорит CGI.pm, что этот скрипт запущен, как скрипт с заголовком, не подлежащим грамматическому разбору. Смотрите использование скриптов NPH за большей информацией.

Параметр -method говорит браузеру, какой метод использовать для переадресации. Это удобно, если, например, ваш скрипт был вызван из операции POST заполняемой формы, а вы хотите переадресовать браузер на статическую страницу, которая требует GET.

Все другие параметры, распознаваемые методом header(), также справедливы в redirect.

Ярлыки HTML

Создание заголовка HTML

Это вернет закрытый заголовок HTML и открывающий тег . Все параметры необязательные:

  • Название документа (-title)
  • Адрес электронной почты автора создаст тег
  • , если присутствует (-author)
  • Флаг истинности, если вы хотите включить тег в заголовок (-base). Он поможет разрешить относительные адреса с абсолютными, когда документ перемещен, но сделает иерархию документов непортативной. Используйте с осторожностью!
  • Параметр -xbase, если вы хотите включить тег , который указывает некоторое внешнее расположение. Пример:
  • Параметр -target, если вы хотите иметь все ссылки и заполняемые формы на странице при переходе к другому кадру (frame). Пример:

-target может быть использован или с -xbase или с -base.

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

Поддержки типа HTTP-EQUIV для тега нет. Это потому что вы можете изменять заголовок HTTP непосредственно методом header. Пример:

Параметр -dtd используется, чтобы заставить start_html() генерировать для данного документа определение типа документа SGML. Оно используется редакторами SGML и издательскими системами Web класса high-end, чтобы определить тип документа. Однако, оно нарушает работу некоторых браузеров, в частности AOL. Значение этого параметра может быть одним из следующих:

    действительный DTD (смотрите http://ugweb.cs.ualberta.ca/

gerald/validate/lib/catalog для списка). Пример:

  • значение истинности, которое не начинается с «-//», в этом случае вы получите стандартный DTD по умолчанию (справедливо для HTML 2.0).

  • Вы можете изменить DTD по умолчанию, вызвав default_dtd() с предпочитаемым значением.

  • Параметр -style используется, чтобы определить каскадную таблицу стилей. Больше информации по этому вопросу может быть найдено в ограниченной поддержке каскадных таблиц стилей
  • Параметр -head используется, чтобы определить произвольные элементы радела . Например:

    Параметр -script используется, чтобы определить функции Netscape JavaScript, чтобы включить их в страницу HTML. Это предпочтительный способ, чтобы библиотеку функций JavaScript, которые будут вызываться откуда-нибудь изнутри страницы. CGI.pm будет пытаться форматировать код JavaScript тем же способом, каким браузеры не-Netscape не хотят пытаться демонстрировать код JavaScript. К сожалению некоторые браузеры тем не менее путаются. Вот пример того, как создать библиотеку JavaScript и включить ее внутрь кода заголовка HTML:

    Netscape 3.0 и выше позволяет вам помещать код JavaScript во внешний документ и ссылаться на него по URL. Это позволяет вам хранить код JavaScript в файле или скрипте CGI , чтобы не загромождать каждую страницу исходным кодом. Netscape 3.X-4.X и Internet Explorer 3.X-4.X также распознают параметр «language», который позволяет вам использовать другие языки, такие как VBScript и PerlScript (ну да!) Чтобы использовать эти атрибуты передайте в параметр -script ссылку на хеш, содержащий один или более ключей language, src или code. Вот, как сослаться на URL внешнего скрипта:

    Вот как сослаться на код скрипта, включенного непосредственно в страницу:

    Последняя особенность позволяет вам включать множество разделов

    Perl и CGI: практическое руководство

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

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

    Здесь присутствует лишь одно такое поле с
    именем COLOR. При просмотре через браузер чел
    видит стандартное текстовое поле с
    возможностью ввода. Предположим, что наш
    подопытный юзер ввел «BLACK». При нажатии
    на кнопку SUBMIT скрипту с именем pingwin.pl
    передается запрос вида параметр=значение,
    где «параметр» это имя поля формы, а
    значение это значение, которое было
    присвоено данному параметру, т.е. в нашем
    случае это будет COLOR=BLACK. Однако, в Перле нет
    встроенной поддержки обработки параметров,
    принятых через CGI и нам придется писать код,
    чтобы потом можно было пользоваться этими
    значениями. Получилось что-то вроде этого:

    @pairs = split(/&/,$buffer);
    foreach $pair(@pairs) <
    ($name, $value) = split(/=/,$pair);
    $value =

    Это дало нам хеш вида

    %FORM qw(
    параметр1 значение1
    параметр2 значение2

    параметрN значениеN );

    Теперь мы можем получать значение
    определенного параметра, юзая стандартный
    для хеша синтаксис — $FORM<'параметр'>. В нашем
    случае $FORM <'COLOR'>дает результат «BLACK».
    Если тебе лень гимориться с этими хешами в
    процессе написания скрипта, то можешь для
    простоты работы в начале проги присвоить
    обычным переменным значения хеша. Например,

    Ну вот, кажись, с этим и всё, теперь ты
    спокойно можешь оперировать этой
    переменной, как и любой другой создаваемой
    в процессе написания кода.

    Теперь разберем метод GET. Отличия его от POST
    не такие уж и большие, а с точки зрения юзера
    вообще незаметны. Заключаются он в передачи
    параметров и значений. В отличие от POST, они
    передаются в строке вызова скрипта. Для
    примера опять будем юзать форму про
    пингвина и цвета. Когда юзверь нажимает
    кнопу SUBMIT, браузер делает запрос к скрипту
    вида http://perl-cool.org/cgi-bin/pingwin.pl? параметр1=значение1&параметр2=значение2&параметрN=значениеN.
    В нашем примере это будет http://perl-cool.org/cgi-bin/pingwin.pl?COLOR=BLACK
    . Зная это, можно самому, без формы
    обращаться к скрипту, указывая параметры и
    значения в адресной строке своего браузера.
    Очень полезно, когда требуется создать
    ссылку на скрипт с определенными
    параметрами. Но из-за этой особенности
    меняется и код опознания параметров. Он
    имеет следующий вид:

    Ладно, кажется, с распознаванием параметров/значений
    всё, теперь пора понять технологию вывода
    результатов в окошко браузера пользователя.

    Для начала надо сообщить этому самому
    браузеру, что далее следует HTML-документ. Для
    этого используем стандартный вывод:

    print «Content-type: text/html\n\n»;

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

    Теперь ты можешь выводить весь HTML,
    используй всё тот же стандартный метод
    вывода оператора print, но этот способ
    является ОЧЕНЬ неудобным. Намного удобнее
    делать это, используя так называемый here-документ.
    Выглядит он так:

    Print 31337 Example \n»;
    print » Типа здесь будет текст…\n»;
    print »
    А теперь строчкой ниже…\ \n»;
    print «

    FastCGI-приложение на Perl. Часть первая.

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

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

    В чем разница?

    В случае обычного CGI-приложения взаимодействие между веб-сервером и приложением осуществляется через STDIN и STDOUT. В случае же, когда применяется FastCGI, взаимодействие между клиентом и сервером осуществляется через Unix Sockets или через TCP/IP.

    Более интересным из этих двух вариантов является взаимодействие через TCP/IP. Этот вариант позволяет получить два ключевых преимущества:

    1) FastCGI-приложения могут быть запущены не только на том же сервере, на котором работает веб-сервер, но и на любом другом. Таких серверов и запущенных на них FastCGI-приложений может быть сколько угодно, а это, в свою очередь, дает практически неограниченный простор для масштабирования системы. Система перестала справляться с нагрузками? Ничего страшного — можно очень просто, совершенно ничего не перестраивая, добавить нужное количество серверов. Максимальное вмешательство в существующую систему будет заключаться, всего лишь, в добавлении строчки со списком новых IP в конфиг веб-сервера.

    2) FastCGI-приложение может быть реализовано в виде демона, т.е. оно само может являться сервером. Обычное CGI-приложение запускается веб-сервером при каждом новом запросе. На запуск приложения уходит львиная часть времени, зачастую запуск занимает больше времени, чем выполняемая им далее полезная работа. А FastCGI-приложение запущено всегда, ему нет нужды тратить время на запуск, ему достаточно только выполнять полезную работу.

    За эти прелести нужно платить. Во-первых, написание FastCGI-приложения несколько сложнее, чем написание CGI-приложения. Во-вторых, веб-сервер требует некоторой дополнительной настройки, а, возможно, и замены.

    Начнем с веб-сервера.

    Веб-сервер в нашем случае будет играть роль исключительно маленькую, он не будет ни разруливать виртуальные хосты, ни выполнять скрипты, ни отдавать статику. Вся его работа будет сводиться к передаче запроса от браузера к FastCGI-приложению. Для такой задачи хорошо подойдет nginx.

    Для настройки nginx’а на работу с нашим приложением в конфиг nginx’а нужно добавить следующую конструкцию:

    (за подробностями настройки nginx’а обращаться к первоисточнику)

    Запускаем nginx. Допустим, в nginx’е был настроен виртуальный хост test.host, тогда запрос в браузере к адресу test.host/fcgi-bin будет передан nginx’ом нашему FastCGI-приложению. Пока самого приложения еще нет, в браузер будет выдано что-то типа такого:

    «The page you are looking for is temporarily unavailable. Please try again later. „

    Это нормально. Так и должно быть.

    Теперь перейдем непосредственно к написанию FastCGI-приложения.

    Протокол FastCGI реализован в Perl в виде модуля FCGI. Обратите внимание — на CPAN’е в наличии есть и другие модули, позволяющие работать с FastCGI, например, CGI::Fast, но все они являются просто надстройками над FCGI. Мы будем работать напрямую с “фундаментальным» модулем FCGI.

    Разберем некоторые моменты подробнее.

    Функция OpenSocket открывает сокет и биндит на него порт 9000. Не забывайте — именно этот порт мы раньше указали в конфиге nginx’а. Еще не забывайте — порты ниже 1024 нельзя открыть, не будучи пользователем root.

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

    Функция Request создает обработчик запросов. Обработчик «перехватывает» стандартные дескрипторы и связывает их с веб-сервером. Это означает, в частности, что если при запросе в скрипте произойдет какая-то ошибка, то сообщение о ней будет выведено не на консоль, а отдано вебсерверу. Искать это сообщение нужно в логе nginx’а. Ну, в общем-то, у обычных CGI-скриптов поведение в этом плане аналогично, с той только разницей, что логи CGI-приложения находятся рядом, а логи FastCGI-приложения могут находиться совсем на другом сервере.

    Не пренебрегайте выводом заголовка «Content-Type» (ну, или хоть какого-нибудь заголовка). Без этого nginx откажется что-либо выводить в браузер. В общем, такое поведение также аналогично поведению веб-сервера при работе с обычным CGI-приложением.

    Хорошо, написали скрипт, запускаем его. Если вы нигде не допустили синтаксической ошибки, то скрипт запустится молча, ничего не выведет и не отпустит консоль — это нормально, так и должно быть. Сейчас скрипт должен слушать порт 9000 и ждать, пока к нему не обратится веб-сервер.

    Теперь запускаем браузер и открываем адрес test.host/fcgi-bin — помните, вы его уже открывали, когда проверяли настройку nginx’а? Но на этот раз вместо сообщения о недоступности страницы должна появиться незатейливая цифра 1. Понажимайте кнопку F5. Цифра должна увеличиваться.

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

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

    Оглавление:

    Пару слов от автора

    Что меня заставило взятся за этот нелегкий труд написания данного учебного пособия. Ну во первых то что практически НЕТ ничего по CGI-програмированию на русском языке, а большинству тех,кто хотел бы изучить CGI, документация на английском в отличии от тех немногих типа меня практически недоступна для понимания.Чтоб помочь им преодолеть этот в первую очередь языковый барьер я и сел писать эту книгу.
    Еще причина ,отчасти перекликающаяся с первой, это то что когда говорят об интернет-программировании обычно излагают HTML со всеми тэгами, которые всем уже по ночам в кошмарах снятся ,ну а после чего начинают долго охать и ахать над прелестями нового аппаратно и платформо-независимого, переносимого, безопасного. и.т.д. языка Java.Иногда в еще и могут тонким краешком затронуть JavaScript.Видя эту не побоюсь этого слова безнадежную ситуацию, я как доблестный CGI-программист решил хоть что-то поправить к лучшему. Если у меня это хоть немного удалось, то напишите мне.
    Если также у вас есть какие-то вопросы -тоже пишите, я с радостью постараюсь ответить на них всех.

    Краткое лирическое отступление насчет CGI

    Итак что такое CGI— скрипты и вообще подобные вещи. Начнем с того что ваш браузер (когда вы набрали URL) соединяется по протоколу HTTP с указаным сервером и просит у него нужный файл,примерно так:

    Вот это самое главное в запросе

    Ну тут дальше идет посылаемая браузером информация о себе и о том что более подробно ему надо.(Например Accept: */*)

    Ну и если запрошен простой файл например .html то если если такой файл есть, То сервер отошлет браузеру ответ:

    В ответе , состоящем из зоголовка и тела, в заголовке содержится код возврата и информация о типе содержимого. Далее после пустой строки (она нужна чтоб отделить заголовок от тела) идет информация из самого документа , по заданому URL .
    Вот в принципе и весь WWW . ходишь от ссылки к ссылке.
    А что если Нужно внести в этот унылый процесс что-нибудь по настоящему интерактивное , динамическое,прекрасное и великолепное. Чтож есть ответ и на этот вопрос. Просто что если в запрашиваемом URL указать специальную программу (CGI,программа Common Gateway IntefaceОбщего Шлюзового Интерфейса) и то что эта прога выдаст то и отправитьс браузеру. Сервер запускает .cgi программу и она например обработав данные формы заносит вас куда-нибудь в свою базу данных,а вам сообщит что вы большой молодец 🙂
    Ну надеюсь я вас заинтриговал.

    Итак . приступим.

    Краткие сведения о том что надо знать чтоб писать CGI скрипты:
    Ну вопервых надо знать что такое интернет и как он работает (а вы знаете? ;))) ) Ну и чуть-чуть умения програмировать(это самое главное)

    На кого ориентировано данное учебное пособие -спросите вы ? Ну в принципе на достаточно широкую аудиторию тех, кто занимается Интернет-программированием и кто хотел бы освоить премудрости интерфейса CGI. Данная книга будет весьма полезна для web-дизайнеров, системных администраторов интернет-серверов, программистов и для простых пользователей интернет, которые хотели бы сделать свой сайт по-настоящему достойным называться хорошим сайтом.
    Так как интернет в основном строится на операционной системе UNIX , то изложеный сдесь материал может быть без особых модификаций реализован на практически любой UNIX-системе.
    Кроме того, я также делаю предположение , что ваш web-сервер поддерживает интерфейс CGI и для вас эта поддержка включена. (на «халявных» серверах администраторы отключают CGI и SSI для пользовательских директорий — просто это такая политика — предоставлять только ОЧЕНЬ МИНИМАЛЬНЫЙ сервис.) Так что если вы хотите изучать CGI то вам нужет нормальный ,полнофункциональный сервер. Если же вы сами являетесь системным администратором на своем сервере , то для вас, естественно нет проблем, ведь включить CGI для какой-нибудь директории — это просто подправить одну строчку в файле конфигурации сервера.

    Если же вы используете Windows NT ,то материал данной книги вам будет тоже очень полезен, однако будьте готовы к тому что в некоторые скрипты придется вносить значительные изменения. В некоторых случаях,когда сказывается то , что возможности NT по работе с сетью намного хуже, чем у UNIX,то некоторые скрипты вовсе нельзя будет использовать.

    Давайте вместе писанем какой нибудь простенький скриптик а потом я вам расскажу где сдесь собака порылась.
    Ну сначала в своем домашнем каталоге создайте директорию cgi-bin:

    cd public_html
    mkdir cgi-bin
    chmod 0777 cgi-bin

    Последняя строчка будет очень важна.
    Возьмите редактор и наберите:
    Сохраните его в директории cgi-bin под именем first.cgi .Ну как сохранили?
    А теперь сделайте его исполняемым(ведь это программа):

    chmod +x first.cgi

    Ну вот,подходим к торжественному моменту. наберите в строке браузера http://www.ваш.сервер.ru/

    ваш_логин/cgi-bin/first.cgi
    и посмотрите чо будет. Будет одно из двух ,либо скрипт заработает и вы увидите сгенерированую им страничку (поздравляю,в нашем полку прибыло!) либо Internal Server Error -тогда не расстраивайтесь,вы что-то сделали не так.
    Вам тогда пригодится пособие по ловле блох.
    Ну вопервых проверку синтаксиса можно осуществить следующим образом:

    perl -с first.cgi

    Perl вам сразу выдаст либо сообщения об ошибках(ну бывает,точку с запятой пропустили, скобочки или кавычки забыли закрыть. ) это сразу по ходу дела поправимо.
    Более грубая с логической точки зрения это пропустить вывод пустой строки, которая отделяет заголовок от тела:

    Разберем скрипт:
    Первая строка #!/usr/bin/perl Просто указывает где в системе расположен компилятор Perl. Обычно он находится /usr/bin/perl или /usr/local/bin/perl ,выяснить это можно одной из комманд или ну или (что очень долго) запустить полный поиск .
    Вторая строка это просто коментарий -вы можете тыкать чо угодно после знака #, однако я пишу обычно во второй строке название скрипта, что очень удобно.
    Затем идет print «Content-Type: text/html\n\n»; Это заголовок указывающий тип содержимого.
    Все что скрипт печатает в свой стандартный вывод STDOUT идет на обработку к серверу. Пустая строка отделяет заголовок от тела,которое в нашем случае представляет собой
    Сервер обработает ответ скрипта и на базе него сформирует и пошлет браузеру ответ.(Сервер обычно не изменяет тела сообщения,он только дополняет заголовок нужными для работы протокола HTTP полями)

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

    Переменные среды CGI

    Предыдущий скрипт не содержал ничего особенно замечательного,так просто вываливал HTMLый текст который благополучно и отбражался на экране браузера.Но По настоящему мощь придает CGI возможность обработки параметров,которые переданы скрипту.например вы можете набрать
    http://www.somehost.ru/somedir/cgi-bin/my_cgi.cgi?param=value
    то есть вы хотите чтоб скрипт my_cgi.cgi обработал для вас параметер param со значением value (ну это например) или когда вы заполнили запрос в форме (в например yahoo или altavista).Ну это с точки зрения пользователя. А на сервере при запуске CGI-скрипта сервер формирует среду окружения в которой скрипт может найти всю доступную информацию о HTTP-соединении и о запросе.
    Вот эти переменные:

    Это одно из самых главных поле используемое для определения метода запроса HTTP Протокол HTTP использует методы GET и POST для запроса к серверу.Они отличаются тем что при методе GET запрос является как-бы частью URL т.е. http://www. /myscript.cgi?request а при методе POST данные передаются в теле HTTP-запроса (при GET тело запроса пусто) и следовательно для CGI тоже есть различие при GET запрос идет в переменную QUERY_STRING а при POST подается на STDIN скрипта.
    Пример:REQUEST_METHOD=GET

    Это строка запроса при методе GET. Вам всем известно что запрос из формы кодируется браузером поскольку не все символы разрешены в URL некоторые имеют специальное назначение. Теперь о методе urlencode: неплохо бы чисто формально напомнить,что все пробелы заменяются в URL на знак ‘+’, а все специальные и непечатные символы на последовательность %hh ,где hh-шестнадцатиричный код символа,разделитель полей формы знак ‘&’,так что при обработке форм надо произвести декодирование.
    Пример:QUERY_STRING= name=quake+doomer&age=20&hobby=games

    Длина в байтах тела запроса.При методе запроса POST необходимо считать со стандартного входа STDIN CONTENT_LENGTH байт,а потом производить их обработку.Обычно методом POST пользуютс для передачи форм,содержащих потенциально большие области ввода текста TEXTAREA.При этом методе нет никаких ограничений,а при методе GET существуют ограничения на длину URL .
    Пример:CONTENT_LENGTH=31

    Тип тела запроса(для форм кодированых выше указаным образом он application/x-www-form-urlencoded)

    IP-Адрес удаленого хоста,делающего данный запрос.
    Пример:REMOTE_ADDR=139.142.24.157

    Если запрашивающий хост имеет доменное имя,то эта переменная содержит его, в противном случае -тот же самый IP-адресс что и REMOTE_ADDR
    Пример:REMOTE_HOST=idsoftware.com

    Имя скрипта,исполизованое в запросе.Для получения реального пути на сервере используйте SCRIPT_FILENAME
    Пример:SCRIPT_NAME=/

    Имя файла скрипта на сервере.
    Пример:SCRIPT_FILENAME=/home/p/paaa/public_html/cgi-bin/guestbook.cgi

    Имя серера ,чаще всего доменное как www.microsoft.com ,но в редких случаях за неимением такового может быть IP-адресом как 157.151.74.254
    Пример:SERVER_NAME=www.uic.nnov.ru

    TCP-Порт сервера используюшийся для соединения .По умолчаниию HTTP-порт 80, хотя может быть в некоторых случаях другим.
    Пример:SERVER_PORT=80

    Версия протокола сервера.
    Пример:SERVER_PROTOCOL=HTTP/1.1

    Програмное обеспечение сервера.
    Пример:Apache/1.0

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

    Давая запрос на сервер браузер обычно расчитывает получить информацию определеного формата,и для этого он в заголовке запроса указывает поле Accept:,Отсюда скрипту поступает cписок тех MIME,которые браузер готов принять в качестве ответа от сервера.
    Пример:HTTP_ACCEPT=text/html,text/plain,image/gif

    Браузер обычно посылает на сервер и информацию о себе,чтоб базируясь на знании особеностей и недостатков конкретных браузеров CGI-скрипт мог выдать информацию с учетом этого. Например,разные браузеры могут поддерживать или не поддерживать какие-то HTMLые тэги.
    Пример:HTTP_USER_AGENT=Mozila/2.01 Gold(Win95;I)

    Имя хоста к которому обращается браузер. Так как физически на одном сервере может находиться сразу много серверов (Виртуальные Хосты), то должен быть способ сообщить серверу к какому именно идет обращение. Скрипт же может тоже в зависимости от этой переменной производить различные действия, таким если он используется на сайтах сразу нескольких виртуальных хостов.
    Пример:HTTP_HOST=www.nnov.city.ru

    Ну,начнем применять на практике усвоеные уроки. Так как все ваши .cgi -файлы должны быть исполняемыми то чтоб облегчить себе жизнь заведите себе в директории cgi-bin командный файл mkcgi ,содержащий и сделайте его в свою очередь исполняемым chmod +x mkcgi -он сильно упростит вам жизнь.
    Ну а теперь запускайте скрипт.
    Изучив информацию,выдаваемую данным скриптом вы сможете лучше ориентироваться в переменных окружения CGI.

    Прекрасный язык Perl

    Вы наверное обратили свое внимание что CGI скрипты пишутся обычно на языке Perl (Practical Extraction and Report Language)— очень удобном языке,впитавшем из других все лучшие черты.Может у вас возникнуть сомнение :Ну вот!Изучать новый язык программирования!? Спешу вас успокоить,изучение Perl не будет в тягость (я сужу по своему опыту!). Вы даже сами не заметите как выучите его.Если вы хоть когда-нибудь программировали скажем на C и использовали утилиту grep для поиска регулярных выражений в тексте,то вам будет еще легче. Для Perl родной платформой является Unix поэтому пользователям PC он мало известен. Мое целенаправленое доведение Perl до широкой публики началось с того что я скачал Perl под Windows (фирмы ActiveWare) К нему прилагается отличная гипертекстовая HTML— документация, даже быстрого просмотра которой хватит , чтобы начать хорошо и широко использовать его. Хоть он значительно уступает и по скорости и по эффективности своему Unix’ному аналогу, все равно самый лучший способ изучить язык это программировать на нем. Если вы как я дома используете большую часть времени не Windows а Unix то с изучением Perl у вас вообще не должно быть особых сложностей. Я же от себя могу сказать, что даже после небольшого опыта изучения его, он стал моим любимым языком программирования.

    Все в нем сделано для удобства программиста (в отличии например от Java ;( )
    Начнем с переменных,они в Perl бывают 3х типов скаларные,списковые(массивы) и хэши(ассоциативные массивы). Для указания компилятору(да и для немалого удобства программиста) перед именем скалярной переменной стоит знак ‘$’ перед массивом ‘@’,перед хешем ‘%’. т.е. например $scalar_var,@array_var,%hash_var Скалярные переменные могут быть как числовые так и строковые,но это не надо указывать Perl сам по контексту в зависимости от операций может привести одно к другому.
    Например: «123»+»4″ будет 127 (или «127») так как операция ‘+’ действует над числами а вот если применить операцию конкатенации строк ‘.’ то строковое «test» . 1 будет «test1»
    Ну а вот операции над скалярными переменными:

    Операцыи Описание Пример
    + — * / % Арифметические print 2*7+4/(8%3);
    print int(127/15); #целая часть
    ** Возведение в степень print 2**16;
    ++ — Инкремент-декремент $i++;
    & | ^

    >

    Побитовые $x=3;$y=4;
    print $x|$y;
    print $x&$y;
    == != = Числовые операции сравнения if($x==9)
    eq ne lt gt le ge cmp стрковые операции сравнения if($game eq ‘doom’)
    || && ! Логические if(($x==9)||($game eq ‘doom’))
    ?: Условный оператор $x=($game eq ‘quake’?9:8);
    , Последовательное вычисление $x=10,$y=20;
    . Конкатенация $x=’http://’.’www.uic.nnov.ru’;
    x Повторение $x=’1234’x5; #$x=’12341234123412341234′
    =


    Сопоставление с образцом if($url=

    То же но с отрицанием if($url!

    = >= .= x=

    Присваивание $x+=$y;

    Пусь это будет вам справочником ,да кстати насчет строк,вы заметили,что они могут быть в двойных и одинарных кавычках, разница между ними состоит в том ,что в одинарных не осуществляется подстановка переменных, а в двойных осущестляется, Например: Списки: Спискочные переменные начинаются с символа ‘@’ конструируются следующим образом Также можно список использовать как lvalue: Можно обращаться к нескольким,выбраным элементам массива(срезу массива): Обратится к скаларному значению -элементу массива можно $имя_массива[индекс], сдесь обратите внимание на знак ‘$’— мы ведь обращаемся к скаляру-элементу.
    Теперь немного о хешах:
    хеш это такой массив который состоит из пар ключ-значение, весь хеш обозначается %хеш ,к отдельным элементам доступ $хеш конструируется хеш так: Хеш может быть также сконструирован из массива с четным числом элементов где пары превращаются в ключ-значение удаление из хеша -операция delete: есть функции выдающие ключи и значения соответственно. Операторы:
    Набор операторов в Perl Очень широк,многие из них прямые аналоги имеющихся в других языках,например if,for,while;но есть и значительные улучшения имеюшихся и конечно новые.
    Тот же самый оператор if имеет две формы (как когда удобнее): В пару к оператору if имеется оператор unless : означающий if с отрицанием: Также в пару while существует until
    синтаксис оператора for полностью аналогичен C: новшеством(и приятным) является foreach позволяющий пройтись по всем элементам массива,присваивая по очереди его элементы какой-то переменной, его синтаксис такой:
    Последний пример особенно важен для упрощения вашего тяжкого труда програмиста и демонтстрирует интересную особенность Perl-переменную по умолчанию $_: в оргомном количестве операторов и функций при опускании аргумента она подразумевается по умолчанию. Она также по умолчанию сопоставляется с регулярным выражением: как видите затраты труда значительно сокращаются,благодаря этому маленькому трюку.

    Регулярные выражения.
    регулярное выражение записывается между двух слэшей /рег_выр/ это самый простой пример применения регулярного выражения а теперь посложнее вот тут в табличке (из того что я помню наизусть):

    Символ Значение Пример применения
    . Соответствует любому символу print if /ab.c/;
    [мн-во симв] Соответствует любому символу из данного мн-ва /[abc]d/;#соответствует ad,bd,cd
    [^мн-во] Отрицание мн-ва символов /[^xyz]/;#
    (. ) Группировка элементов(и также запоминание в переменных $1 $2 $3 . ) /(xyz)*/
    /([abc].[^xy]qwerty)/
    (..|..|..) Одна из альтернатив
    * повторение образца 0 или более раз /.*/;#соответствует всему
    ? Повторение 0 или 1 раз /(http:\/\/)?.*\.cgi/
    + Повторение 1 или более раз
    повторение от n до m раз
    повторение точно n раз
    повторение n и более раз
    Спец символы:
    \t \r \n . Управляющие символы:табуляции,возврат каретки,перевод строки.
    \d Соответствует цифре,Аналог [0-9]
    \D Соответствует нецифровому симсволу,аналог[^0-9]
    \w Соответствует букве
    \W Соответствует небуквеному символу
    \s Соответствует пробельным символам(пробелы,табуляции,новые строки..)
    \S Соответствует непробельному символу
    \b Соответствует границе слова $test1=»this is test»;
    $test2=»wise»;
    if($test1=

    /\bis\b/)#нет

    \B Соответствует не границе слова /\Bis\B/ соответсвует ‘wise’ но не ‘is’

    Для того чтоб поместить в регулярное выражение любой специальный символ,поставьте реред ним обратный слэш Заставить Perl игнорировать регистр можно поставив i после регулярного выражени
    Полезные функции.
    В Perl очень много различных функций ,как говорится на все случаи жизни,все о них конечно не опишу,но обо многих. Начну с тех,которые больше относятся к операторам. Операция замены s/рег.выражение/строка/ игнорировать регистр — опция i глобальная(по всей строке) замена -опция g; Пример: Очень полезная опция у s/// e -она означает что вторая строка не строка а выражение, результат которого и будет подставлен. Например,у вас есть файл в котором все записи о возрасте через год надо менять или более показательным примером послужит функция urldecode,которая будет встречатс в каждой вашей программе,обрабатывающей формы: Также важным удобством в Perl являются операции для работы с файлами для выполнения схожих функций в других языках приходиться проделывать огромную массу работы. Аргументами могут быть как Файловые переменные,так и строки,представляющие имя файла.

    Операция Описание Пример использоввания
    -r Доступен для чтения unless(-r «myfile»)
    -w Доступен для записи
    -x Для исполнения
    -o Принадлежит пользователю if(-o «index.htm»)
    -R Доступен для чтения реальным
    пользователем,а не только «эффективным».
    Имеет значения для set-uid -скриптов
    if(-r FILE)>
    -W Доступен для записи реальным пользователем
    -X Доступен для исполнения реальным пользователем
    -O Принадлежит реальному пользователю
    -e Файл или каталог Существует unless(-e $htmlfile)<
    open(HTML,»>$htmlfile»);
    print HTMLFILE » «;
    close(HTMLFILE);
    >
    -z Существует,но имеет нулевую длину if(-z ‘tmpfile’)
    -s Размер файла в байтах system(«rar m -m5 archive.rar $myfile») if -s $myfile > 1000;
    -f Файл существует и является простым файлом
    -d Файл существует и является каталогом if(-d ‘public_html’)
    -l Символической ссылкой
    -p Каналом FIFO
    -u Имеет бит установки пользователя
    -g Имеет бит установки группы
    -k Установлен sticky-бит
    -t Является терминальным устройством
    -M Время с последнего изменения (в днях) while(defiled($file=glob(‘*’))) <
    if(-M $file >= 7.0) <
    unlink($file);#удаляем слишком старые файлы
    >
    >
    -A Время последнего доступа(в днях) if(-A «$ENV<'HOME'>/public_html/index.html»
    избавиться от символа новой строки на конце поможет функция chomp, ведь этот символ может помешаться например в имени файла или при выводе на экран Если также подставить списочную переменную,то получим список строк файла от текущей строки и до конца бинарный файл можно читать и писать функциями sysread и syswrite:
    sysread(ФАЙЛОВАЯ_ПЕРЕМЕННАЯ,$скалярная_перемменая,сколько_байт)
    syswrite(ФАЙЛОВАЯ_ПЕРЕМЕННАЯ,$скалярная_перемменая,сколько_байт)
    функции split и join: @Список=split(/рег.выр/,$скаляр);
    $скаляр=join(строка,@Список);
    Встроеные функции Perl можно вызывать со скобками или без (как вам удобно), скобки программисты указывают или для красоты,или чаще,что устранить возможную неоднозначность в выраженнии: Надеюсь что я вас позабавил примерами функций 😉.

    Примеры применения Perl для различных нужд.
    Следующая программа переводит текстовый файл в формат HTML (вспомните сколько хлопот вам доставит отлов во всем файле ‘ ‘ и ‘&’ чтоб заменить их на &tl; , > и & а как неплохо чтоб автоматически все http://www. превратились в http://www. ) Более подробную информацию о Perl вы можете получить по адресам:
    http://www.perl.com
    http://www.metronet.com/0/perlinfo/perl5/manual/perl.html
    http://www.ActiveWare.com/

    Заголовки запросов и ответов

    Даже если вы и знаете кое-что о HTTP все равно не лишне будет вспомнить о том как это все работает тем более на эту информацию придется ориентироваться при написании CGI скриптов.
    Этапы соедирения.
    Первый этап это когда HTTP -клиент(браузер) соединяется с сервером.для этого он использует протокол TCP/IP соединение происходит к известному клиенту TCP-порту (80 -номер порта HTTP) (другие сервисы сидят на других портах ,например FTP и SMTP на 21 и 25)
    Вторым этапом идет запрос клиента:клиент передает заголовок запроса и возможно(в зависимости от метода) тело сообщения запроса.В заголовке обязательно указывается метод ,URI,и версия HTTP,и может быть еще несколько необязательных полей
    Третий этап -ответ сервера,который опять таки состоит из заголовка,в котором сервер указывает версию HTTP и код статуса, который может говорить о успешном или неуспешном результате и его причинах.Далее идет тело ответа.
    Четвертым этапом происходит разрыв TCP/IP соединения.
    HTTP -запрос.
    Запрос состоит из Строки запроса(она обязательна) и остальных полей. Синтаксис строки :МЕТОД URI HTTP/версия
    где -пробел , -переход на новую строку
    Методы HTTP.
    GET
    Самый часто применяемый метод,в протоколе HTTP/0.9 был единственным методом,и применяется для извлечения информации по заданому URI Может быть условным если в заголовке указано поле If-Modified-Since:

    HEAD
    Почти идентичен GET но отличается тем что сервер не возвращает тело обьекта а только его заголовок (метаинформацию) программы могут применять его для проверки гиперссылок на правильность,доступность и изменения.

    POST
    передает данные для обработки их программой ,указаной в URI сдесь обязательно указывается поле Content-Length:

    Сушествуют и другие ,реже применяемые методы,например PUT -для сохранения передавемых данных в указаном URI и DELETE для удаления ресурса.

    Поля заголовка запроса.
    После строки запроса идут поля заголовка запроса. Поля общего(general-header) заголовка (он общий как для запросов так и для ответов):
    Date:
    Указывает дату запроса,например:
    Date: Sun, 20 Nov 1994 08:12:31 GMT

    MIME-version:
    Указывает версию MIME (по умолчанию 1.0)
    MIME-version: 1.0

    Pragma:
    Содержит указания для таких промежуточных агентов как прокси и шлюзы,
    Pragma: no-cache

    Поля относящиеся к запросу(Request-Header):
    Authorization:
    Содержит информацию аутентификации
    Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

    From:
    Браузер может посылать адрес пользователя серверу
    From: quake@doom.ru

    If-Modified-Since:
    используется при методе GET ресурс возвращается ,если он был изменен с указаного момента, может использоваться при кешировании.
    If-Modified-Since:Mon 15 Jul 1997 00:15:24 GMT

    Referer:
    Содержит URL предшествующего ресурса.
    Referer: http://www.uic.nnov.ru/

    User-Agent:
    Програмное обеспечение клиента.
    User-Agent: Mozilla/3.0

    Заголовок информации сообщения (Entity-Header) применяется как в запросах так и в ответах (при этом некоторые поля только в ответах):
    Allow: (в ответе сервера)
    Список методов,поддерживаемых ресурсом.
    Allow: GET, HEAD

    Content-Encoding:
    идентифицирует метод кодировки,которым был закодирован ресурс
    Content-Encoding: x-gzip

    Content-Length:
    Длина тела сообщения
    Content-Length: 102

    Content-Type:
    Содержит тип ресурса(MIME),для текстовых еще и кодировку символов(необязательно)
    Content-Type: text/html; charset=windows-1251

    Expires: (в ответе сервера)
    Дата окончания действия ресурса,применяется в кешировании для запрета кеширования устаревших ресурсов (в ответе)
    Expires: Tue, 24 Sep 1998 23:00:15 GMT

    Last-Modified: (в ответе сервера)
    Время последнего обновления ресурса
    Last-Modified: Tue, 23 sep 1998 13:48:40 GMT

    Другие поля:
    Поля Accept: указывают серверу выдавать только указаные форматы данных,которые клиент может распознать.
    Accept: text/html
    Accept: text/plain
    Accept: image/gif

    Поле Host: служит для того , чтобы указать, к какому хосту идет обращение. Данное поле не входит в число обязательных. Однако оно является необходимым в тех случаях, когда одному физическому серверу соответствует несколько виртуальных хостов. В этом поле тогда указывается какой из виртуальных хостов имеется в виду.
    Host: www.nnov.city.ru

    Примеры запросов: Ответ HTTP-сервера.
    Ответ идет от сервера.Состоит он из строки состояния и затем поля ответа Общий заголовок(General-Header) и заголовок тела сообщения (Entity-Header),которые уже описаны при обсуждении запроса. и еще идет заголовок ответа(Response-Header).
    Строка состояния имеет следующий формат:
    HTTP/version Status-Code Status-Phrase
    где HTTP/version версия,Status-Code -3х значный код,и Status-Phrase текстовая фраза, поясняющая код ,пример: HTTP/1.0 200 Ok
    ,200 -код означающий успешную обработку запроса,что и поясняет «Ok» Заголовок ответа состоит из полей:
    Location:
    Содержит URI ресурса,может быть использован для переключения клиента в другое место, если например ресурс был перемещен в другое место или на другой сервер.
    Location: http://www.uic.nnov.ru/newlocation/index.html

    Server:
    Информация о програмном обеспечении сервера
    Server: Apache/1.1

    WWW-Autenticate:
    Параметры аутентификации.
    WWW-Autenticate: Basic realm=»doomsday»

    Коды ответов HTTP.

    Код статуса Значение
    200 OK
    201 Успешная команда POST
    202 Запрос принят
    203 Запрос GET или HEAD выполнен
    204 Запрос выполнен но нет содержимого
    300 Ресурс обнаружен в нескольких местах
    301 Ресурс удален навсегда
    302 Ресурс отсутствует временно
    304 Ресурс был изменен
    400 Плохой запрос от клиента
    401 Неавторизованый запрос
    402 Необходима оплата за ресурс
    403 Доступ Запрещен
    404 Ресурс не найден
    405 Метод не применим для данного ресурса
    406 Недопустимый тип ресурса
    410 Ресурс Недоступен
    500 Внутренняя ошибка сервера
    (это по вашу душу,юные CGI-программисты ;( )
    501 Метод не выполнен
    502 Неисправный шлюз либо перегруз сервера
    503 Сервер недоступен/тайм-аут шлюза
    504 Вторичный шлюз/тай-аут сервера

    Более подробное описание всех кодов можно найти в RFC-1945
    Несколько примеров:
    CGI-заголовок.
    В том случае когда запрашиваемый URI есть CGI-скрипт сервер базируясь на данных запроса создает среду переменных CGI и передает управление скрипту скрипт должен выдать CGI-заголовок,после которого и идет тело ответа,сгенерированое скриптом.
    Заголовок (CGI-Header) состоит из полей:
    Content-Type:
    Должно обязательно присутствовать,если есть тело.
    Content-Type: text/html

    Location:
    Содержит URL ресурса на который скрипт перенаправляет запрос.Как правило,если присутствует это поле больше ничего не указывается.
    Location: http://www.idsoftware.com/index.html

    Status:
    Позволяет CGI скрипту вернуть статус обработки,если это поле не задано,то сервер подразумевает
    Status: 404 Not found

    На базе этой информации сервер и формирует окончательный заголовок,который и передается клиенту.
    Примеры: nph-скрипты.
    Иногда возникает необходимость чтобы CGI -скрипт сам отвечал напрямую клиенту, минуя разбор заголовка.Это во-первых уменьшает нагрузку на сервер,и во вторых, что самое главное такой прямой ответ клиенту позволяет скрипту полностью контролировать транзакцию.Для этого существуют nph-скрипты(Not Parse Header) ,имя скрипта должно начинатьс с префикса «nph-« ,Например «nph-animate.cgi» .Такие скрипты сами формируют HTTP-ответ клиенту,что полезно при анимации:
    Этот пример вам выдаст анимацию ,составленую из нескольких .gif -файлов.Если же вы получили вместо анимации сообщение об ошибках,то вам следует,может быть перейти к следующей главе, которая поведает вам о правах доступа- того,без чего Unix не был бы Unixом.

    Права Доступа

    Я бы ни за что не написал этот раздел,если бы он не был так важен.Сидя в пределах своей домашней директории и занимаясь только тем,что качаете с Инета всякую херню,вы возможно и не задавались некоторыми вопросами. а зря. Ведь немного надо,чтоб попортить нервы начинающему CGI -програмисту.
    Одна из таких вещей это права доступа.
    Начнем с того ,что в системе Unix каждый пользователь имеет свой идентификатор- число,уникально идентифицирующее его в этой системе.(Мой логин paaa а ему соответсвует число 1818).Это число внутреннее для операционной системы,для пользования оно представлено как логин,который и соответствует пользователю.
    Только не надо думать о пользователе,как о конкретном человеке сидящим за клавиатурой, пользователем может быть и какой-нибудь процесс.Важно отметить что пользователь-это определенна область прав доступа,которая ему соответствует.(Вы например не можете обычно писать и удалять файлы из каталога другого пользователя). Это и дает возможность стабильной работы всей системы.
    Итак есть идентификатор пользователя.Также имеется идентификатор группы.
    Группа служит для выделения пользователей по группам. Например у пользователей группы users (Обычные пользователи) не такие права как у группы wheels (административная группа).
    Каждый процесс который вами запущен(Будь то Netscape,терминал,или текстовый редактор)получают ваши идентификаторы пользователя и группы. таким образом исполняются от вашего имени.
    Теперь рассмотрим повнимательней файловую систему.В Unix с файлом связано много характеристик. Во-первых в системе нет «ничьих» файлов ,все файлы имеют владельца-пользователя и владельца-группу. Любой файл который вы создаете автоматически получает ваш идентификатор.По этому система очень легко отслеживает, чьи это файлы и каталоги.
    Следующее новшество по сравнению с DOS это права доступа к файлу.Их может сменить только тот пользователь которому принадлежит файл,или супервизор.(Это в отличии от DOS где каждая дрянь типа вируса может снять атрибут readonly читать и писать все файлы ;()
    Права доступа задаются обычно числом в восьмеричной записи и разбиты на 3 части по 3 бита: Каждая часть задает права доступа для конкретной группы:

    1я -права доступа для пользователя,которому принадлежит файл
    2я -для группы которой принадлежит файл
    3я -для всех остальных

    В каждой такой категории выделяются 3 права: Право на чтение,Право на запись,и право на исполнение. (все права и аттрибуты очень наглядно показаваютя командой ls с ключом -l) Так как исполнять каталоги бессмыслено,то право на исполнение для них означает право обращатся к файлам из этого каталога.

    Бит Описание
    8 Право на чтение для пользователя
    7 Право на запись для пользователя
    6 Право на исполнение для пользователя
    5 Право на чтение для группы
    4 Право на запись для группы
    3 Право на исполнение для группы
    2 Право на чтение для всех остальных
    1 Право на запись для всех остальных
    Право на исполнение для всех остальных

    Изменяются права командой chmod,ее синтаксис такой:
    chmod [u|g|o]<+|-> file
    chmod number file
    ,где uuser,ggroup,oother,rread,wwrite,x-execute;-удалить,+-установить
    Примеры:
    chmod +r file.txt #разрешает всем право на чтения файла
    chmod u+w file.txt #устанавливает для владельца файла право на запись в него
    chmod +x gbook.cgi #право на исполнение для всех,как для ползователя,группы,и для других
    chmod 0777 cgi-bin #Разрешает самые широкие права доступа для cgi-bin

    Приоткрытии файла программой,операционная система сравнивает идентификатор пользователя с идентификатором пользователя владельца файла, если они равны,то действуют права пользователя,если не равны то сравниваются идентификаторы группы,если и они не равны,то действуют права доступа для остальных остальных.В том случае если у процесса нет достаточных прав,система возвращает ошибку. Следует заметить ,что для супервизора root права доступа не проверяются.
    Можно выполнить скрипт,только если есть права на его исполнение. Вот почему следует давать chmod +x *.cgi иначе ваши скрипты станут просто недоступными. Но и это еще не все.
    Ваш скрипт может обращатся к вашим файлам (например ведет базу данных гостевой книги). Все выглядит нормально,но только ничего не работает,файл в который вы намеревались писать,
    не открывается,знакомая проблема ;(( ?.Так вот чтобы вы не мучались в догадках Ваш скрипт не может получить доступ к вашим файлам,потому что он выполняется не вами (не с вашим идентификатором), а от имени nobody (непривелигированый пользователь).Это мера предосторожности направлена на то, чтоб скрипты ,взбесившись из-за неправильно переданых параметров(или вообще от глюков) не могли ничего повредить ценного и важного на сервере.
    Поэтому к тем файлам,к которым скрипт по смыслу должен обращатся нужно присвоить самые широкие права доступа 0777
    Например в случае гостевой книги chmod 0777 guestbook.dat
    Если также важно чтоб скрипты могли заводить новые файлы в cgi-bin то надо дать также права на это chmod 0777 cgi-bin
    Если вы видите что ваш скрипт не может обратится к какому-то файлу,то это в 99% случаев из-за вашей забывчивости.
    На самый крайний случай воспользуйтесь setuid-скриптами (к этому делу ,если вы на это решились,отнеситесь ОЧЕНЬ серьезно,так как целые тома по безопасности в Unix посвящены именно setuid-программам). Хочу сразу предупредить ,сам я таких не так уж много писал,да и вам не особенно советую. Но для общего как говорится развития,имейте в виду следующую информацыю.
    Кроме указания прав доступа,существуют специальные биты у файла.Это биты установки пользователя и группы. Когда процесс выполняется(простой процесс) то его реальный и эффективный идентификаторы пользователей совпадают,идентификаторы групп тоже. На самом деле значение имеют как раз эффективные значения пользователя и группы,они учавствуют в сравнении прав доступа. Нельзя ли их как-то изменить,когда уж совсем нужда заставит? Можно! .На этот вопрос дают ответ программы с установленым битом пользователя.Когда система запускает такую программу,она присваивает новому процессу не идентификатор того пользователя,что запустил ее, а идентификатор пользователя-владельца исполняемого файла.
    Самый классический пример setuid-программ это программа passwd ,предназначеная для смены пароля пользователя. Такие данные как пароль и прочие характеристики пользователей хранятся в специальном файле,который имеет огромное значение при входе в систему. Так как это системный файл,то открыть к нему доступ на запись всем-значит подвергнуть ВСЮ систему риску,ведь любое неправильное изменение его повлечет катастрофические последствия(в конце концов бывает просто хулиганство). Поэтому доступ к этому файлу закрыт для всех пользователей.А что если надо сменить пароль? Запускаем программу passwd! Если глянуть на ее аттрибуты ,то видно что она принадлежит root -супервизору, и еще имеет установленый бит setuid. Так корректно обходится эта проблема.
    Если вы все-же решили попытаться ,то знайте ,что сделать программу setuid можно
    коммандой : chmod +s myprogramm

    И как всгда Примерчик напоследок:
    Эта программа выдает содержимое вашей директории public_html в том случае,если она доступна для чтения,и для каждого файла указывает ,можно ли его читать,писать и исполнять. Попробуйте ее сделать setuid и посмотрите как изменится результат.

    Генерация ответа

    Большую часть того что нужно знать о генерации ответа,я сказал в разделе Заголовки запросов и ответов.Нет,не угадали! Я не буду сдесь говорить о всяком дизайне того что вы выдаете.Этому вы успели напрактиковатся на HTML -страничках.
    Я поговорю о MIME (Multipurpose Internet Mail Extension).И о разных браузерах.
    Стандарт MIME появился в электронной почте (e-mail) потому что остро стала проблемма пересылки по e-mail различных данных в различных форматах.Так как HTTP тоже работает с различными типами данных то поэтому тоже использует MIME для своих нужд. Типы MIME состоят из Типа и подтипа (например text/plain,где text-указывает на наличие текстового содержимого,а plain-уточняет его как простой текст) приведеный ниже список (он далеко не полн,типов MIME огромное количество) описывает некоторые часто встречающиеся типы.: text/html text/plain text/richtext image/gif image/jpeg image/tiff audio/basic audio/32kadpcm audio/ video/mpeg video/quicktime multipart/mixed multipart/alternate multipart/ application/octet-stream application/msword application/postscript message/digest
    Информация о MIME больше возможно пригодится вам в том случае если вы собираетесь работать из ваших скриптов с электронной почтой,но и для WWW она не повредит. Особенно знание Content-Type:
    Content-Type:
    Состоит из типа и подтипа типы могут быть как стандартные так и экспериментальные начинающиеся с префикса ‘x-‘:

    text
    Текстовые данные.Первым подтипом который включен сюда это plain,что значит простой текст. сюда же включен самый ходовой формат html .У типа text как и у многих типов могут быть параметры,главным из них является charset он как раз и указывает на раскладку символов, которая применена в тексте, так что если вы хотите указать браузеру какую раскладку применять, то просто укажите charset:
    Content-Type: text/plain; charset=us-ascii
    Content-Type: text/html; charset=iso-8859-1
    Content-Type: text/html; charset=koi8-r

    multipart
    Данные которые могут состоять из нескольких частей,различных типов данных.Поэтому параметром multipart служит boundary, позволяюший указать разделитель.Каждый фрагмент в многочастевом сообщении имеет свой Content-Type: (Он может быть также multipart,т.е. допускаются вложеные multipart,главное чтоб boundary были разными).В электронной почте применяется больше multipart/mixed (основной подтип) и multipart/alternative (Он отличается тем что показывается одна из альтернатив,например сообщение шлется в простом и HTMLом форматах,и почтовая программа показывает либо часть,которую она способна отобразить). В WWW -програмировании распостранен x-mixed-replace ,который означает что следующая часть должна заменить предыдущую после подгрузки, что применяется для анимации(см.Пример с анимацией).
    Теперь о разделителе,его надо выбирать так,чтоб он не встретился где-то в данных (т.е. что-то вроде «diUr344rnmvforgefvrg923rghyj2»).Когда вы задали разделитель,например boundary=»boundary» то когда закончилась одна часть,вы должны выдать строку —boundary,последн часть —boundary—,причем эти разделители должны быть на отдельной строке,а не сливаться с текстом:
    Пример:

    message
    Представляет инкапсулированое почтовое сообщение.Используется в e-mail ,а не в WWW.

    image
    Некоторое Графическое изображение.(чаще всего image/gif и image/jpeg)

    application
    бинарные данные какого-нибудь приложения.В том случае если данное приложение может быть запущено,Браузер запускает его.Например при поступлении данных application/msword Браузер спросит,нужно ли запустить Word для просмотра досумента.При отсутствии нужного приложения браузер спросит в каком файле сохранить данные.Подтип octet-stream как раз и означает поток байт информации,который и используется по умолчанию.(К сожалению не все так гладко,известен глюк в Netscape Navigator‘е который вместо того чтоб сохранить application/octet-stream пытается его показать как text/plain что если это сгенерировано из CGI,ни к чему хорошему не приводит ;(()
    Что касается application ,то Вы можете тут смело извращатся,используя x- типы данных,
    Например application/x-fuck-to-netscape-navigator. ;)))))
    Часто используемый параметр name позволяет указать имя файла.Например:
    Content-Type: application/msword; name=»readme.doc»
    Что полезно при полученнии файлов через HTTP,причем этот параметр может применятся и для других типов таких image или audio ,Например:
    Content-Type: image/gif; name=»myfoto.gif»

    Content-Transfer-Encoding:
    Применяется больше в системе электронной почты и обозначает метод кодирования, которым были закодированы данные при передаче сообщения.Например:
    7bit 8bit quoted-printable base64 binary x-типы
    MIME-Version:
    Указывает версию MIME .

    Теперь поговорим о разных браузерах вы знаете что браузеры бывают разные,разных версий на разных платформах, поддерживают и не разные тэги и глюки у них тоже разные. ;((( .
    Это могло попортить много нервов WEB-дизайнерам и конечно же нам ,CGI-програмистам. Профессионально написаный сайт от просто хорошего отличается тем что хорошо выглядит Не только на экране того браузера,которым пользуется сам его автор,а на других тоже.
    Если вы используете JavaScript для своих страничек,то вы уже наверно использовали (или хотя бы вам в голову приходила мысль использовать)свойства navigator.AppName navigator.AppCodeName navigator.appVersion navigator.userAgent:
    Ну не волнуйтесь вы так ,мы CGI-программисты не в самых худших условиях на этот счет. Вспомните о том что браузер сам при запросе посылает вам данные о себе и о своей версии. И делает он это для того,чтобы эту информацию можно было учесть.
    В запросе он указывает User-Agent: которое и попадает на сервере в переменную среды HTTP_USER_AGENT ,которую и можно использовать.
    Например если в ней содержится Mozilla/3.01Gold (Win95;I) то значит вы имеете дело с Netscape (Mozilla-кодовое название Netscape Navigator‘а),версии 3.01Gold и далее после имени и версии может следовать необязательная информация ,например как в приведеном примере о платформе Win95 и о том является ли версия U -для США (USA) или I -международной(International). Напомню,что такая информация необязательна.(То есть если браузер послал информацию User-Agent: то гарантировано расчитывать вы можете только на Название/Версия).
    Ну вот я слишком много развел демагогии,пора переходить к практическим примерам.
    Допустим ваш скрипт генерирует какие-то тэги,которые слишком старые браузеры не поддерживают,причем без них не обойдешся,они составляют всю ‘изюминку’ сайта.
    Ну уже почувствовали,насколько это здорово.А вот еще примерчик.Это из разряда того, что тэги бывают разные.Например в Explorer есть тэг BGSOUND предназначеный для проигрывани музыки на страничке.(В Netscape этого тега нет,и поэтому для втыкания музыки приходится использовать подключаемые модули plugin).Мутится с этими Плугинами Вам в облом,а хочется побаловать человека хорошей музыкой,если браузер позволяет. Ну вот вы уже можете управлять этим процессом.Только не забывайте,что если вы не получили информацию о клиенте(так может быть,если например ваш скрипт вызвал какая-нибудь поисковая машина) то не в этом случае не надо делать никаких предположений,а просто пусть ваш скрипт продолжает делать то что должен был делать.

    Как всегда Примерчик на последок.Этот примерчик позволит выбирать из списка файлов. и загружать что пользователь хочет.

    Обработка Форм

    Ну вот ,вы уже знаете достаточно,кое в чем уже успели приобрести опыт, пришло время перейти к очень важной теме — обработке форм. При всей простоте (кажушейся) это едва ли не самое главное предназначение всего стандарта CGI . Куда бы вы не зашли на любой уважающий себя сайт,везде вы встретите формы, которые вам предложат заполнить.В этом деле можно положится только на CGI, так как Java и JavaScript ,выполняющиеся на страничке у клиента не имеют доступа к серверу,на котором находится сайт.
    Коротко вспомним о том что происходит при рассматриваемом процессе поближе,так сказать на трезвую голову 😉. Итак браузер требует у сервера определенный URL (это может быть как простой документ,так и сгенерированый CGI) в этом документе может содержаться форма.Отображая такой документ браузер также выводит элементы формы (кнопки, поля ввода, поля ввода пароля, переключатели, радио-кнопки, списки, текстовые области,скрытые поля). И со всем этим добром пользователь может взаимодействовать.К форме естественно имеет доступ и встроеный язык программирования JavaScript -он может как использовать форму для своих нужд,не передавая CGI,так и помогать пользователю в заполнении формы.
    После того,как пользователь заполнил форму он нажимат кнопку Submit которая говорит, что форму надо отправить на сервер. Браузер собирает все имена и значения элементов формы ,кодирует их методом urlencode и в зависимости от указаного в тэге FORM метода вызывает GET или POST с указаным URL,передавая ему данные. На сервере CGI-скрипту это попадает (в зависимости от метода) либо в переменную QUERY_STRING либо на STDIN.Скрипт может проверить данные ,занести их в какую нибудь базу данных,может как yahoo выполнить какой-нибудь поиск, может что-нибудь вычислить. да мало ли что он может,все зависит только от нашей фантазии. В конце концов скрипт выдает браузеру ответ,который он и отображает.В этом ответе может содержаться все что вашей душе угодно от сообщения об удачном или неправильном запросе до таких ответов,по сравнению с которыми yahoo и altavista подвиснут от зависти, главное чтоб вам и тем кто посещает ваш сайт это нравилось.😉

    Ну а теперь немного о синтаксисе элементов форм ,их описании и самое главное особенностях при обработке CGI-скриптом.
    Итак немного экскурс в HTML:
    FORM
    Атрибуты:
    action
    как раз и задает тот URL,который будет и обрабатывать форму, если он опущен,то текущий URL документа(а он-то может быть сгенерирован нашим скриптом).
    method
    задает метод GET или POST
    enctype
    обычно не задается,для форм он application/x-www-form-urlencoded -по умолчанию, и поддерживается всеми CGI скриптами.Но если вы уж очень хотите чтобы браузер послал вам данные в другом формате (например text/plain) то можете указать этот тип кодировки,только потом не жалуйтесь,что ваш скрипт не может разделить поля,или вообще начинает глючить когда пользователь ввел какой-то спецсимвол.
    name
    Задается для JavaScript,чтоб обращатся к форме по имени,а не по номеру. Для CGI не играет ни какой роли,так как внутреннее для браузера.
    target
    Может Определять в какой фрейм отправить полученую информацию.Имеет значение во фреймосодержащих документах.Прозрачен для CGI обработки данных.
    onSubmit
    Определяет JavaScript -обработчик активизации формы.Применяется для проверки JavaScript‘ом правильности заполнения.Опять таки прозрачен для CGI.
    Пример типичной формы: Форма может содержать элементы.Элементы имеют имена,которые используются дл кодирования пар имя=значение.Некоторые Элементы не передаются CGI,а используются JavaScript для управления,например кнопки.Некоторые поля передаются только в тех случаях, когда в них что-то выбрано,например списки и переключатели.Остальные поля передаются всегда, даже когда они пустые.
    Например: Допустим вы ввели имя lesha и адрес paaa@uic.nnov.ru,при этом выбрали переключатель После нажатия кнопки будет отправлен вот такой запрос:
    http://www.doom/cgi-bin/test.cgi?Name=lesha&Email=paaa@uic.nnov.ru&doomer=Yes
    Если же вы не выбрали переключатель,то запрос будет таким:
    http://www.doom/cgi-bin/test.cgi?Name=lesha&Email=paaa@uic.nnov.ru
    ,как видите элемент doomer не вошел в строку запроса
    Теперь попробуйте оставить поля редактирования пустыми:
    http://www.doom/cgi-bin/test.cgi?Name=&Email=
    Эти элементы (Name и Email) присутствуют и сообщают что они пустые.

    Кнопка(button)

    В форме изображается кнопка,при нажатии которой вызывается JavaScript-обработчик заданый атрибутом onClick ,атрибут name служит для JavaScript-именования кнопки а не дл передачи CGI.Так как значение кнопки не передается CGI, value задает Текст,изображаемый на кнопке.

    Submit

    Кнопка,предназначеная для передачи формы.Опять же,сама не передается,а служит только для управления. текст на ней задается атрибутом value.
    Reset

    Кнопка очистки формы.При ее нажатиивсем измененым элементам возвращается значение по умолчанию.
    Поле ввода(text)

    Применяется очень часто,поэтому тип «text» служит для INPUT по умолчанию,его не надо каждый раз указывать.Имя поля,задаваемое name является обязательным для CGI (в отличии от JavaScript,где элементы формы можно индексировать по номерам,а имена для удобства и читабельности кода служат).Можно задать значение по умолчанию атрибутом value,которое будет после загрузки докумета.атрибут size позволяет задать размер поля.Также может содержать обработчики onBlur,onChange,onFocus,onSelect.
    Текстовая Область(textarea)
    Область многострочного редактирования.Размеры в строках и столбцах задаютс атрибутами rows и cols.Значения атрибута wrap «hard» и «soft» -означают соответственно мягкую или жесткую разбивку на строки (в большинстве случаев ето не существенно). На что следует действительно обратить внимание так это на символ,используемый для указания перехода на новую строку. В Windows это ‘\r\n’ а в Unix ‘\n’,так что если это для вас существенно,то приводите преобразование,например так:
    $my_text =

    s/\r\n/\n/g;
    Поле ввода пароля(password)

    Очень похоже на поле ввода,отличается тем что вместо символов в нем отображаютс символы ‘*’.Служит для ввода пользователем пароля.
    Скрытое поле(hidden)

    Поле не отображаемое на экране.Но оно имеет имя и значение и следовательно передается в форму. Служит для того (и очень часто програмисты его применяют) чтоб передавать скрипту какую нибудь информацию.Например,если ваш скрипт обрабатывает несколько форм разных типов,то в скрытом поле каждой формы можно указать с какой формой конкретно вы имеете дело. Так как это ваша внутренняя кухня то нечего пользователю мозолить глаза этой информацией.
    Переключатель(checkbox)
    Text
    В отличии от кнопки,атрибут value сдесь не задает на надпись на переключателе,а его значение(внутреннее).Поэтому если надо что-то подписать,пишите рядом в ним. Может быть сразу выбраным если указан атрибут checked .Если value не указано то значение по умолчанию «on» .Передается только в том случае,когда выбран.
    Радио-кнопка(radio)
    Text
    В отличие от checkbox может быть несколько радиокнопок с одинаковым параметром name ,но с разными value,из них передается только та,что выбрана.Одна из них может быть изначально выбрана по умолчанию checked.Например:
    Список(select)
    Задает список,позволяющий выбрать одну (или несколько) опций из списка. Если атрибут multiple не указан,то создается простой выпадающий список,в котором можно выбрать только одну из опций.Его значение всегда передается,т.к. всегда хоть одно выбрано. Если указан атрибут multiple,то во первых можно указать размер видимой части списка атрибутом size (Если опций больше появится скролинг).Во вторых передаются только выбраные опции ,т.е.Он может передатся несколько раз ?SelectName=opt1&SelectName=opt2&SelectName=opt9 если выбраны скажем несколько опций.А может и не разу,если ничего не выбрано из списка. Можно задавать обработчики onBlur,onChange,onFocus.
    Небольшая Помощь JavaScript
    Для CGI-програмиста конечно JavaScript -это иной мир,вы можете спокойно пропустить этот абзац,если вы не знаете JavaScript,так как написаное в нем к CGI не относится, а скорей к самим формам и дизайну сайта.Я скажу пару слов о том как JavaScript может оказать посильную помощь в проверке правильности заполнения форм.Все проверки конечно можно и нужно делать на сервере,но когда имеешь дело с рассеяным пользователем, то для него заполнение простой формы превратится в мучение.Поясню на примере,в форме есть какие-то обязательные поля,например имя.Если пользователь забыл его указать то скрипт скажет ему об этом в сообщении он исправит это, допустим что-нибудь еще не так ввел . Только на передачу данных по сети может уходить масса времени.А на обработку на локальной машине-доли секуды.
    Вот Например как это можно применить JavaScript для предварительного контроля правильности. Допустим простейшая форма содержит имя и возраст.Имя не должно быть пустым, а возраст должен состоять из цифр. Ну вот ,на этом можно закончить это краткое введение в HTMLые формы.
    Итак,У нас на входе скрипта данные формы,закодированые методом urlencode Положеные в Переменную QUERY_STRING или подаваемые на STDIN.Мы должны вопервых их получить. Вот,мы уже считали наш запрос в переменную $query.Теперь пришло самое время ее обработать. Мы знаем что поля разделены символом ‘&’ значит используем его в качестве разделителя функции split: Вот разделили,а теперь организуем цикл foreach по полученым полям @formfields Сдесь выражение в регулярном выражении в круглых скобках (.*) после знака ‘=’,запоминаетс в скалярную переменную $1 ,которая затем и декодируется нашей старой и знакомой функцией urldecode (я предупреждал,что она будет почти в каждой вашей CGI-программе) Так мы проходим по всем полям,которые нам переданы.Это стандартный подход,он годится в качестве шаблона.У вас может возникнуть вопрос,а что делать если вам переданы данные от списка у которого задана возможность выбора нескольких элементов и данные поступают в таком виде: Sel=opt1&Sel=opt2&Sel=opt9. Тут тоже нет никаких проблем,просто запихиваем эти поступающие значения в массив. И потом спокойно оперируем с Полученым Массивом @Sel.
    На этом можно так сказать заканчивается шаблонная часть скрипта и начинается содержательная, которая зависит только от вашей фантазии.
    Вы можете сколько угодно анализировать полученые значения,обращатся при этом к различным файлам .Если вы к этому приложите фантазию,то кто знает что получится.
    А Пока Ради примера я вам напишу скрипт,который ведет социологическое исследование насчет курения и отношения к нему.Может он слишком массивен для данного пособия, но зато он наглядно показывает как достаточно простыми средствами можно проводить социологические исследования. А вот скрипт для его обработки:

    Изображения ismap

    Анимация

    Когда говорят о каком-то популярном сайте,то частенько к преимуществам относят и анимацию. Действительно,когда изображение изменяется (и особенно к месту 😉),то это смотритс и пользователю нравится.
    Говоря об анимации нужно сразу отметить что нет лучшего способа. Анимацию можно сделать ДЕСЯТКАМИ Способов,каждый хорош в своей области применения. Я перечислю только некоторые из них,которые чаще всего применяются:
    Самый простой,но наименее функциональный способ это GIF с анимацией.
    Потом можно воткнуть анимационный файл MPEG или AVI они более отражают суть анимации, но имеют недостаток,что для проигрывания их на некоторых браузерах нужны специальные подключаемые модули.К тому же они не интерактивны.
    Можно реализовать анимацию в рамках Java-апплета,когда апплет находясь на страничке сам перерисовывается со временем.
    Таким же интерактивным средством служит обращение к массиву document.images[] из JavaScript.Достоинство-помимо интерактивности,полная интегрированость с HTML -станичкой.Но может как и предыдущий использоваться только с относительно новыми браузерами,которые поддерживают Java и JavaScript.

    В общем в каждом случае выбор остается за вами.Вам решать насколько тот или иной способ хорош в вашей ситуации.Я же познакомлю вас с еще одним.
    Вы даже уже были знакомы с этим способом,когда я вам рассказывал о nph- скриптах Теперь когда вы уже так много знаете,можно модифицировать тот пример, добавив в него вызов картинки по случайному принципу: Конечно одно из самых примитивных применений такой системы.Более мощным примером могло бы послужить отслеживание на сервере какого-нибудь периодически изменяющегося файла и пересылка пользователю обновленной версии.
    Такая Система применяется например в Чате,при появлении новых сообщений. Чатовая система достаточно сложна для этого пособия и я не стал сюда ее включать.Однако,если вам очень интересно,то я с удовольствием пришлю ее вам.

    Несколько советов по отладке

    CGI-программы -не самые простые в отладке,по сложности отладки они способны сравнится лишь с отладкой драйверов. Вся сложность заключается в том,что скрипт выполняется не как обычная программа. Он выполняется в специальной среде сервера,которая создается при клиентском запросе, к тому же он исполняется не из под вашего аккаунта,а на непривилегированом уровне.
    Если скрипт не исполняется потому,что вы допустили синтаксические ошибки,то самих этих ошибок вы не увидите,на экране будет только из-за чего она произошла вы можете только гадать. Также если вы забыли задать к какому-то файлу нужные права доступа ,то тоже будет трудно выяснить что же произошло и в чем причина ошибки (если конечно к этому вы не готовы).
    Ну вот ,хватит вас пугать,тем более что нас не запугаешь 😉 !
    Приступим к отладке.Я вам опишу достаточно примитивные меры,которыми я сам пользуюсь.
    Начнем с того что у нас есть скрипт test.cgi мы уже сделали его исполняемым chmod +x test.cgi Простейший способ проверить его на ошибки это команда Ключ -c говорит Perl что надо только проверить синтаксис.Все сообщения об ошибках вы можете видеть и подправить.Более тяжелый случай состоит в том когда Perl встроен в Web -Сервер, причем версии разные.Как у до недавнего времени было на uic‘е ;(( ! Тот Perl с которым работаем в командной строке 4й версии ,а на сервере стоит 5й версии.Если ваша CGI-программа использует при этом какие-нибудь преимущества 5-й версии (например обьектно-ориентированые модули),то вы думаете отладить ее низ -ошибаетесь!.Только приготовтесь к тому, что я сейчас скажу,вы сядте,а то упадете ;)) :
    Закоментируйте всю вашу программу ,т.е. перед каждой строчкой поставьте символ ‘#’. После чего,добавьте вот такие строчки: ,Должно получится так: А теперь запускайте скрипт.Естественно он выдаст Одно только слово ‘Test’. Разкоментируйте несколько строчек.Еще раз запустите скрипт.Он опять выдаст ‘Test’. Значит синтаксически эти только что разкоментированые строчки были правильные. И так далее.
    Если очередной раз после раскоментирования вы запустили скрипт и получили ‘Internal Server Error’ — значит в этих строках содержалась какая-та синтаксическая ошибка. Это способ отловки синтаксических ошибок трудоемок,но к нему придется прибегнуть если ваш скрипт писан под ту версию Perl,что на сервере,а не под ту что у вас.
    Узнать версию Perl можно
    Ну вот мы отловили в нашем скрипте все синтаксические ошибки,он заработал, но это не значит,что он работает правильно.
    Что еще можно посоветовать при отладке CGI-скриптов от ошибок возникающих во время выполнения программы. Допустим какой-то файл не открылся.Конечно показывать перепуганому пользователю эти технические подробности никчему,поэтому заведите себе специальный файл debug.txt и пусть ваши скрипты пишут в этот файл причины своих ошибок и сбоев, да и вообще о всех непредвиденых событиях.
    Это можно реализовать так: Примеры использования (Напомню,что встроеная переменная Perl $! содержит сообщение о причине последней ошибки,поэтому включайте ее всегда в свои сообщения): Потом можно периодически заглядывать в этот файл debug.txt и смотреть,какие ошибки встречались при работе ваших скриптов.Таким образом ваши скрипты сами помогать будут в своей отладке 😉.

    Также очень может оказать помощь (может и не оказать) просмотр http‘шных логов. Все обращения к URL на сервере и все возникающие при этом ошибки идут в логи сервера httpd. Сразу хочу предупредить — размеры этих логов даже на средних размеров сервере достигает десятков мегабайт. Поэтому даже не пытайтесь их вот так просто посмотреть.- Лучше если вы уж за данное дело взялись — воспользуйтесь такими утилитами как grep,head,tail,more,less. .

    Кстати я хочу сказать о причине еще одной (совсем не очевидной) ошибки.Если вы набрали скрипт у себя дома на компутере,то полученый скрипт состоит из текста в DOS‘ом формате, а не в Unix‘ом так что имейте это ввиду. Запускать вам его придется в системе Unix , так что следует перевести програмный текст в нужный формат.
    Дело в том что в системах DOS и Windows (это уж очередной раз скажите все что вы думаете о Билле Гейтсе и Ко) для разделения строк используетс не один («\n»),а пара символов («\r») и («\n»). Для простых HTML-файлов это не критично — браузеры игнорируют такие символы при выводе. Но скрипт является ПРОГРАММОЙ. А в программе никаких символов возврата каретки быть не должно!! Особенно в первой строке. Потому что когда операционная система запускает скрипт, она определяет какое приложение запустить для обработки данного скрипта именно по первой строке. В первой строке как вы знаете содержится #!/usr/bin/perl или #!/usr/local/bin/perl .Поэтому при запуске скрипта mysrcipt (это кстати вы можете сами увидеть коммандами top и ps) Система запускает комманду .А теперь представьте что будет если не убрать символ возврата каретки из Windows-файла. Получиться и естественно что такого приложения нет, и следовательно попытка выполнить коммаду ни к чему не приведет.
    Как с таким злом бороться я раскажу в моей следующей главе.

    Trics and traps

    Примеры приложений:

    Кто посещает мою страничку?

    Гостевая книга

    Счетчик посещений

    Наверное тоже одним из часто встречающихся приложений CGI являются счетчики посещений. Они стоят практически на каждой страничке, возможно даже и у вас. Но иногда вас не устраивает тот факт, что счетчик лежит где-то в другом месте.Из-за этого скажем невозможно начать счет с произвольного числа.Или еще некоторые счетчики по разному фильтруют ‘Reload’. Да и мало ли? Ну а иногда вам хочется просто сделать другой дизайн цифр. То если вы CGI-програмист то возможно имеет смысл написать свой счетчик. И делать с ним что захочется. Вот я так-же написал.
    Скрипт данного счетчика обслужевает несколько счетчиков ,им вы присваиваете идентификаторы. Поэтому вы спокойно можете втыкать независимые счетчики в разные страницы сайта и даже давать это делать друзьям. В общем он прост в использовании: , Где name -любое уникальное имя идентифицирующее счетчик.Вытакже можете задать необязательный параметр dig который задает количество цифр в счетчике ,Например:

    Получится примерно вот так:
    .gif‘ы в счетчике с прозрачными областями.Что дает дополнительную гибкость к примеру для улучшения внешнего вида с помощью другого фона его иногда имеет смысл запихнуть в «таблицу»:

    Свои данные он пишет примерно в такой файл counter.dat: Вы спросите,зачем столько информации? Чтобы отфильтровывать нажатия Reload. Если с одного IP-адреса между заходами промежуток меньше чем 30 секунд,то счетчик не инкрементируется (Так например поступает счетчик в Rambler‘е).
    Теперь об исходнике. Скрипт получился великоват,потому,что сдесь большую часть занимает генерация .gif — файлов.. Выглядит громоздко , зато пашет как трактор ;))!! Если вам циферки не понравились вы их легко сможете заменить.

    Вместо заключения

    Оглавление:

    Пару слов от автора

    Что меня заставило взятся за этот нелегкий труд написания данного учебного пособия. Ну во первых то что практически НЕТ ничего по CGI-програмированию на русском языке, а большинству тех,кто хотел бы изучить CGI, документация на английском в отличии от тех немногих типа меня практически недоступна для понимания.Чтоб помочь им преодолеть этот в первую очередь языковый барьер я и сел писать эту книгу.
    Еще причина ,отчасти перекликающаяся с первой, это то что когда говорят об интернет-программировании обычно излагают HTML со всеми тэгами, которые всем уже по ночам в кошмарах снятся ,ну а после чего начинают долго охать и ахать над прелестями нового аппаратно и платформо-независимого, переносимого, безопасного. и.т.д. языка Java.Иногда в еще и могут тонким краешком затронуть JavaScript.Видя эту не побоюсь этого слова безнадежную ситуацию, я как доблестный CGI-программист решил хоть что-то поправить к лучшему. Если у меня это хоть немного удалось, то напишите мне.
    Если также у вас есть какие-то вопросы -тоже пишите, я с радостью постараюсь ответить на них всех.

    Краткое лирическое отступление насчет CGI

    Итак что такое CGI— скрипты и вообще подобные вещи. Начнем с того что ваш браузер (когда вы набрали URL) соединяется по протоколу HTTP с указаным сервером и просит у него нужный файл,примерно так:

    Вот это самое главное в запросе

    Ну тут дальше идет посылаемая браузером информация о себе и о том что более подробно ему надо.(Например Accept: */*)

    Ну и если запрошен простой файл например .html то если если такой файл есть, То сервер отошлет браузеру ответ:

    В ответе , состоящем из зоголовка и тела, в заголовке содержится код возврата и информация о типе содержимого. Далее после пустой строки (она нужна чтоб отделить заголовок от тела) идет информация из самого документа , по заданому URL .
    Вот в принципе и весь WWW . ходишь от ссылки к ссылке.
    А что если Нужно внести в этот унылый процесс что-нибудь по настоящему интерактивное , динамическое,прекрасное и великолепное. Чтож есть ответ и на этот вопрос. Просто что если в запрашиваемом URL указать специальную программу (CGI,программа Common Gateway IntefaceОбщего Шлюзового Интерфейса) и то что эта прога выдаст то и отправитьс браузеру. Сервер запускает .cgi программу и она например обработав данные формы заносит вас куда-нибудь в свою базу данных,а вам сообщит что вы большой молодец 🙂
    Ну надеюсь я вас заинтриговал.

    Итак . приступим.

    Краткие сведения о том что надо знать чтоб писать CGI скрипты:
    Ну вопервых надо знать что такое интернет и как он работает (а вы знаете? ;))) ) Ну и чуть-чуть умения програмировать(это самое главное)

    На кого ориентировано данное учебное пособие -спросите вы ? Ну в принципе на достаточно широкую аудиторию тех, кто занимается Интернет-программированием и кто хотел бы освоить премудрости интерфейса CGI. Данная книга будет весьма полезна для web-дизайнеров, системных администраторов интернет-серверов, программистов и для простых пользователей интернет, которые хотели бы сделать свой сайт по-настоящему достойным называться хорошим сайтом.
    Так как интернет в основном строится на операционной системе UNIX , то изложеный сдесь материал может быть без особых модификаций реализован на практически любой UNIX-системе.
    Кроме того, я также делаю предположение , что ваш web-сервер поддерживает интерфейс CGI и для вас эта поддержка включена. (на «халявных» серверах администраторы отключают CGI и SSI для пользовательских директорий — просто это такая политика — предоставлять только ОЧЕНЬ МИНИМАЛЬНЫЙ сервис.) Так что если вы хотите изучать CGI то вам нужет нормальный ,полнофункциональный сервер. Если же вы сами являетесь системным администратором на своем сервере , то для вас, естественно нет проблем, ведь включить CGI для какой-нибудь директории — это просто подправить одну строчку в файле конфигурации сервера.

    Если же вы используете Windows NT ,то материал данной книги вам будет тоже очень полезен, однако будьте готовы к тому что в некоторые скрипты придется вносить значительные изменения. В некоторых случаях,когда сказывается то , что возможности NT по работе с сетью намного хуже, чем у UNIX,то некоторые скрипты вовсе нельзя будет использовать.

    Давайте вместе писанем какой нибудь простенький скриптик а потом я вам расскажу где сдесь собака порылась.
    Ну сначала в своем домашнем каталоге создайте директорию cgi-bin:

    cd public_html
    mkdir cgi-bin
    chmod 0777 cgi-bin

    Последняя строчка будет очень важна.
    Возьмите редактор и наберите:
    Сохраните его в директории cgi-bin под именем first.cgi .Ну как сохранили?
    А теперь сделайте его исполняемым(ведь это программа):

    chmod +x first.cgi

    Ну вот,подходим к торжественному моменту. наберите в строке браузера http://www.ваш.сервер.ru/

    ваш_логин/cgi-bin/first.cgi
    и посмотрите чо будет. Будет одно из двух ,либо скрипт заработает и вы увидите сгенерированую им страничку (поздравляю,в нашем полку прибыло!) либо Internal Server Error -тогда не расстраивайтесь,вы что-то сделали не так.
    Вам тогда пригодится пособие по ловле блох.
    Ну вопервых проверку синтаксиса можно осуществить следующим образом:

    perl -с first.cgi

    Perl вам сразу выдаст либо сообщения об ошибках(ну бывает,точку с запятой пропустили, скобочки или кавычки забыли закрыть. ) это сразу по ходу дела поправимо.
    Более грубая с логической точки зрения это пропустить вывод пустой строки, которая отделяет заголовок от тела:

    Разберем скрипт:
    Первая строка #!/usr/bin/perl Просто указывает где в системе расположен компилятор Perl. Обычно он находится /usr/bin/perl или /usr/local/bin/perl ,выяснить это можно одной из комманд или ну или (что очень долго) запустить полный поиск .
    Вторая строка это просто коментарий -вы можете тыкать чо угодно после знака #, однако я пишу обычно во второй строке название скрипта, что очень удобно.
    Затем идет print «Content-Type: text/html\n\n»; Это заголовок указывающий тип содержимого.
    Все что скрипт печатает в свой стандартный вывод STDOUT идет на обработку к серверу. Пустая строка отделяет заголовок от тела,которое в нашем случае представляет собой
    Сервер обработает ответ скрипта и на базе него сформирует и пошлет браузеру ответ.(Сервер обычно не изменяет тела сообщения,он только дополняет заголовок нужными для работы протокола HTTP полями)

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

    Переменные среды CGI

    Предыдущий скрипт не содержал ничего особенно замечательного,так просто вываливал HTMLый текст который благополучно и отбражался на экране браузера.Но По настоящему мощь придает CGI возможность обработки параметров,которые переданы скрипту.например вы можете набрать
    http://www.somehost.ru/somedir/cgi-bin/my_cgi.cgi?param=value
    то есть вы хотите чтоб скрипт my_cgi.cgi обработал для вас параметер param со значением value (ну это например) или когда вы заполнили запрос в форме (в например yahoo или altavista).Ну это с точки зрения пользователя. А на сервере при запуске CGI-скрипта сервер формирует среду окружения в которой скрипт может найти всю доступную информацию о HTTP-соединении и о запросе.
    Вот эти переменные:

    Это одно из самых главных поле используемое для определения метода запроса HTTP Протокол HTTP использует методы GET и POST для запроса к серверу.Они отличаются тем что при методе GET запрос является как-бы частью URL т.е. http://www. /myscript.cgi?request а при методе POST данные передаются в теле HTTP-запроса (при GET тело запроса пусто) и следовательно для CGI тоже есть различие при GET запрос идет в переменную QUERY_STRING а при POST подается на STDIN скрипта.
    Пример:REQUEST_METHOD=GET

    Это строка запроса при методе GET. Вам всем известно что запрос из формы кодируется браузером поскольку не все символы разрешены в URL некоторые имеют специальное назначение. Теперь о методе urlencode: неплохо бы чисто формально напомнить,что все пробелы заменяются в URL на знак ‘+’, а все специальные и непечатные символы на последовательность %hh ,где hh-шестнадцатиричный код символа,разделитель полей формы знак ‘&’,так что при обработке форм надо произвести декодирование.
    Пример:QUERY_STRING= name=quake+doomer&age=20&hobby=games

    Длина в байтах тела запроса.При методе запроса POST необходимо считать со стандартного входа STDIN CONTENT_LENGTH байт,а потом производить их обработку.Обычно методом POST пользуютс для передачи форм,содержащих потенциально большие области ввода текста TEXTAREA.При этом методе нет никаких ограничений,а при методе GET существуют ограничения на длину URL .
    Пример:CONTENT_LENGTH=31

    Тип тела запроса(для форм кодированых выше указаным образом он application/x-www-form-urlencoded)

    IP-Адрес удаленого хоста,делающего данный запрос.
    Пример:REMOTE_ADDR=139.142.24.157


    Если запрашивающий хост имеет доменное имя,то эта переменная содержит его, в противном случае -тот же самый IP-адресс что и REMOTE_ADDR
    Пример:REMOTE_HOST=idsoftware.com

    Имя скрипта,исполизованое в запросе.Для получения реального пути на сервере используйте SCRIPT_FILENAME
    Пример:SCRIPT_NAME=/

    Имя файла скрипта на сервере.
    Пример:SCRIPT_FILENAME=/home/p/paaa/public_html/cgi-bin/guestbook.cgi

    Имя серера ,чаще всего доменное как www.microsoft.com ,но в редких случаях за неимением такового может быть IP-адресом как 157.151.74.254
    Пример:SERVER_NAME=www.uic.nnov.ru

    TCP-Порт сервера используюшийся для соединения .По умолчаниию HTTP-порт 80, хотя может быть в некоторых случаях другим.
    Пример:SERVER_PORT=80

    Версия протокола сервера.
    Пример:SERVER_PROTOCOL=HTTP/1.1

    Програмное обеспечение сервера.
    Пример:Apache/1.0

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

    Давая запрос на сервер браузер обычно расчитывает получить информацию определеного формата,и для этого он в заголовке запроса указывает поле Accept:,Отсюда скрипту поступает cписок тех MIME,которые браузер готов принять в качестве ответа от сервера.
    Пример:HTTP_ACCEPT=text/html,text/plain,image/gif

    Браузер обычно посылает на сервер и информацию о себе,чтоб базируясь на знании особеностей и недостатков конкретных браузеров CGI-скрипт мог выдать информацию с учетом этого. Например,разные браузеры могут поддерживать или не поддерживать какие-то HTMLые тэги.
    Пример:HTTP_USER_AGENT=Mozila/2.01 Gold(Win95;I)

    Имя хоста к которому обращается браузер. Так как физически на одном сервере может находиться сразу много серверов (Виртуальные Хосты), то должен быть способ сообщить серверу к какому именно идет обращение. Скрипт же может тоже в зависимости от этой переменной производить различные действия, таким если он используется на сайтах сразу нескольких виртуальных хостов.
    Пример:HTTP_HOST=www.nnov.city.ru

    Ну,начнем применять на практике усвоеные уроки. Так как все ваши .cgi -файлы должны быть исполняемыми то чтоб облегчить себе жизнь заведите себе в директории cgi-bin командный файл mkcgi ,содержащий и сделайте его в свою очередь исполняемым chmod +x mkcgi -он сильно упростит вам жизнь.
    Ну а теперь запускайте скрипт.
    Изучив информацию,выдаваемую данным скриптом вы сможете лучше ориентироваться в переменных окружения CGI.

    Прекрасный язык Perl

    Вы наверное обратили свое внимание что CGI скрипты пишутся обычно на языке Perl (Practical Extraction and Report Language)— очень удобном языке,впитавшем из других все лучшие черты.Может у вас возникнуть сомнение :Ну вот!Изучать новый язык программирования!? Спешу вас успокоить,изучение Perl не будет в тягость (я сужу по своему опыту!). Вы даже сами не заметите как выучите его.Если вы хоть когда-нибудь программировали скажем на C и использовали утилиту grep для поиска регулярных выражений в тексте,то вам будет еще легче. Для Perl родной платформой является Unix поэтому пользователям PC он мало известен. Мое целенаправленое доведение Perl до широкой публики началось с того что я скачал Perl под Windows (фирмы ActiveWare) К нему прилагается отличная гипертекстовая HTML— документация, даже быстрого просмотра которой хватит , чтобы начать хорошо и широко использовать его. Хоть он значительно уступает и по скорости и по эффективности своему Unix’ному аналогу, все равно самый лучший способ изучить язык это программировать на нем. Если вы как я дома используете большую часть времени не Windows а Unix то с изучением Perl у вас вообще не должно быть особых сложностей. Я же от себя могу сказать, что даже после небольшого опыта изучения его, он стал моим любимым языком программирования.

    Все в нем сделано для удобства программиста (в отличии например от Java ;( )
    Начнем с переменных,они в Perl бывают 3х типов скаларные,списковые(массивы) и хэши(ассоциативные массивы). Для указания компилятору(да и для немалого удобства программиста) перед именем скалярной переменной стоит знак ‘$’ перед массивом ‘@’,перед хешем ‘%’. т.е. например $scalar_var,@array_var,%hash_var Скалярные переменные могут быть как числовые так и строковые,но это не надо указывать Perl сам по контексту в зависимости от операций может привести одно к другому.
    Например: «123»+»4″ будет 127 (или «127») так как операция ‘+’ действует над числами а вот если применить операцию конкатенации строк ‘.’ то строковое «test» . 1 будет «test1»
    Ну а вот операции над скалярными переменными:

    Операцыи Описание Пример
    + — * / % Арифметические print 2*7+4/(8%3);
    print int(127/15); #целая часть
    ** Возведение в степень print 2**16;
    ++ — Инкремент-декремент $i++;
    & | ^

    >

    Побитовые $x=3;$y=4;
    print $x|$y;
    print $x&$y;
    == != = Числовые операции сравнения if($x==9)
    eq ne lt gt le ge cmp стрковые операции сравнения if($game eq ‘doom’)
    || && ! Логические if(($x==9)||($game eq ‘doom’))
    ?: Условный оператор $x=($game eq ‘quake’?9:8);
    , Последовательное вычисление $x=10,$y=20;
    . Конкатенация $x=’http://’.’www.uic.nnov.ru’;
    x Повторение $x=’1234’x5; #$x=’12341234123412341234′
    =

    Сопоставление с образцом if($url=

    То же но с отрицанием if($url!

    = >= .= x=

    Присваивание $x+=$y;

    Пусь это будет вам справочником ,да кстати насчет строк,вы заметили,что они могут быть в двойных и одинарных кавычках, разница между ними состоит в том ,что в одинарных не осуществляется подстановка переменных, а в двойных осущестляется, Например: Списки: Спискочные переменные начинаются с символа ‘@’ конструируются следующим образом Также можно список использовать как lvalue: Можно обращаться к нескольким,выбраным элементам массива(срезу массива): Обратится к скаларному значению -элементу массива можно $имя_массива[индекс], сдесь обратите внимание на знак ‘$’— мы ведь обращаемся к скаляру-элементу.
    Теперь немного о хешах:
    хеш это такой массив который состоит из пар ключ-значение, весь хеш обозначается %хеш ,к отдельным элементам доступ $хеш конструируется хеш так: Хеш может быть также сконструирован из массива с четным числом элементов где пары превращаются в ключ-значение удаление из хеша -операция delete: есть функции выдающие ключи и значения соответственно. Операторы:
    Набор операторов в Perl Очень широк,многие из них прямые аналоги имеющихся в других языках,например if,for,while;но есть и значительные улучшения имеюшихся и конечно новые.
    Тот же самый оператор if имеет две формы (как когда удобнее): В пару к оператору if имеется оператор unless : означающий if с отрицанием: Также в пару while существует until
    синтаксис оператора for полностью аналогичен C: новшеством(и приятным) является foreach позволяющий пройтись по всем элементам массива,присваивая по очереди его элементы какой-то переменной, его синтаксис такой:
    Последний пример особенно важен для упрощения вашего тяжкого труда програмиста и демонтстрирует интересную особенность Perl-переменную по умолчанию $_: в оргомном количестве операторов и функций при опускании аргумента она подразумевается по умолчанию. Она также по умолчанию сопоставляется с регулярным выражением: как видите затраты труда значительно сокращаются,благодаря этому маленькому трюку.

    Регулярные выражения.
    регулярное выражение записывается между двух слэшей /рег_выр/ это самый простой пример применения регулярного выражения а теперь посложнее вот тут в табличке (из того что я помню наизусть):

    Символ Значение Пример применения
    . Соответствует любому символу print if /ab.c/;
    [мн-во симв] Соответствует любому символу из данного мн-ва /[abc]d/;#соответствует ad,bd,cd
    [^мн-во] Отрицание мн-ва символов /[^xyz]/;#
    (. ) Группировка элементов(и также запоминание в переменных $1 $2 $3 . ) /(xyz)*/
    /([abc].[^xy]qwerty)/
    (..|..|..) Одна из альтернатив
    * повторение образца 0 или более раз /.*/;#соответствует всему
    ? Повторение 0 или 1 раз /(http:\/\/)?.*\.cgi/
    + Повторение 1 или более раз
    повторение от n до m раз
    повторение точно n раз
    повторение n и более раз
    Спец символы:
    \t \r \n . Управляющие символы:табуляции,возврат каретки,перевод строки.
    \d Соответствует цифре,Аналог [0-9]
    \D Соответствует нецифровому симсволу,аналог[^0-9]
    \w Соответствует букве
    \W Соответствует небуквеному символу
    \s Соответствует пробельным символам(пробелы,табуляции,новые строки..)
    \S Соответствует непробельному символу
    \b Соответствует границе слова $test1=»this is test»;
    $test2=»wise»;
    if($test1=

    /\bis\b/)#нет

    \B Соответствует не границе слова /\Bis\B/ соответсвует ‘wise’ но не ‘is’

    Для того чтоб поместить в регулярное выражение любой специальный символ,поставьте реред ним обратный слэш Заставить Perl игнорировать регистр можно поставив i после регулярного выражени
    Полезные функции.
    В Perl очень много различных функций ,как говорится на все случаи жизни,все о них конечно не опишу,но обо многих. Начну с тех,которые больше относятся к операторам. Операция замены s/рег.выражение/строка/ игнорировать регистр — опция i глобальная(по всей строке) замена -опция g; Пример: Очень полезная опция у s/// e -она означает что вторая строка не строка а выражение, результат которого и будет подставлен. Например,у вас есть файл в котором все записи о возрасте через год надо менять или более показательным примером послужит функция urldecode,которая будет встречатс в каждой вашей программе,обрабатывающей формы: Также важным удобством в Perl являются операции для работы с файлами для выполнения схожих функций в других языках приходиться проделывать огромную массу работы. Аргументами могут быть как Файловые переменные,так и строки,представляющие имя файла.

    Операция Описание Пример использоввания
    -r Доступен для чтения unless(-r «myfile»)
    -w Доступен для записи
    -x Для исполнения
    -o Принадлежит пользователю if(-o «index.htm»)
    -R Доступен для чтения реальным
    пользователем,а не только «эффективным».
    Имеет значения для set-uid -скриптов
    if(-r FILE)>
    -W Доступен для записи реальным пользователем
    -X Доступен для исполнения реальным пользователем
    -O Принадлежит реальному пользователю
    -e Файл или каталог Существует unless(-e $htmlfile)<
    open(HTML,»>$htmlfile»);
    print HTMLFILE » «;
    close(HTMLFILE);
    >
    -z Существует,но имеет нулевую длину if(-z ‘tmpfile’)
    -s Размер файла в байтах system(«rar m -m5 archive.rar $myfile») if -s $myfile > 1000;
    -f Файл существует и является простым файлом
    -d Файл существует и является каталогом if(-d ‘public_html’)
    -l Символической ссылкой
    -p Каналом FIFO
    -u Имеет бит установки пользователя
    -g Имеет бит установки группы
    -k Установлен sticky-бит
    -t Является терминальным устройством
    -M Время с последнего изменения (в днях) while(defiled($file=glob(‘*’))) <
    if(-M $file >= 7.0) <
    unlink($file);#удаляем слишком старые файлы
    >
    >
    -A Время последнего доступа(в днях) if(-A «$ENV<'HOME'>/public_html/index.html»
    избавиться от символа новой строки на конце поможет функция chomp, ведь этот символ может помешаться например в имени файла или при выводе на экран Если также подставить списочную переменную,то получим список строк файла от текущей строки и до конца бинарный файл можно читать и писать функциями sysread и syswrite:
    sysread(ФАЙЛОВАЯ_ПЕРЕМЕННАЯ,$скалярная_перемменая,сколько_байт)
    syswrite(ФАЙЛОВАЯ_ПЕРЕМЕННАЯ,$скалярная_перемменая,сколько_байт)
    функции split и join: @Список=split(/рег.выр/,$скаляр);
    $скаляр=join(строка,@Список);
    Встроеные функции Perl можно вызывать со скобками или без (как вам удобно), скобки программисты указывают или для красоты,или чаще,что устранить возможную неоднозначность в выраженнии: Надеюсь что я вас позабавил примерами функций 😉.

    Примеры применения Perl для различных нужд.
    Следующая программа переводит текстовый файл в формат HTML (вспомните сколько хлопот вам доставит отлов во всем файле ‘ ‘ и ‘&’ чтоб заменить их на &tl; , > и & а как неплохо чтоб автоматически все http://www. превратились в http://www. ) Более подробную информацию о Perl вы можете получить по адресам:
    http://www.perl.com
    http://www.metronet.com/0/perlinfo/perl5/manual/perl.html
    http://www.ActiveWare.com/

    Заголовки запросов и ответов

    Даже если вы и знаете кое-что о HTTP все равно не лишне будет вспомнить о том как это все работает тем более на эту информацию придется ориентироваться при написании CGI скриптов.
    Этапы соедирения.
    Первый этап это когда HTTP -клиент(браузер) соединяется с сервером.для этого он использует протокол TCP/IP соединение происходит к известному клиенту TCP-порту (80 -номер порта HTTP) (другие сервисы сидят на других портах ,например FTP и SMTP на 21 и 25)
    Вторым этапом идет запрос клиента:клиент передает заголовок запроса и возможно(в зависимости от метода) тело сообщения запроса.В заголовке обязательно указывается метод ,URI,и версия HTTP,и может быть еще несколько необязательных полей
    Третий этап -ответ сервера,который опять таки состоит из заголовка,в котором сервер указывает версию HTTP и код статуса, который может говорить о успешном или неуспешном результате и его причинах.Далее идет тело ответа.
    Четвертым этапом происходит разрыв TCP/IP соединения.
    HTTP -запрос.
    Запрос состоит из Строки запроса(она обязательна) и остальных полей. Синтаксис строки :МЕТОД URI HTTP/версия
    где -пробел , -переход на новую строку
    Методы HTTP.
    GET
    Самый часто применяемый метод,в протоколе HTTP/0.9 был единственным методом,и применяется для извлечения информации по заданому URI Может быть условным если в заголовке указано поле If-Modified-Since:

    HEAD
    Почти идентичен GET но отличается тем что сервер не возвращает тело обьекта а только его заголовок (метаинформацию) программы могут применять его для проверки гиперссылок на правильность,доступность и изменения.

    POST
    передает данные для обработки их программой ,указаной в URI сдесь обязательно указывается поле Content-Length:

    Сушествуют и другие ,реже применяемые методы,например PUT -для сохранения передавемых данных в указаном URI и DELETE для удаления ресурса.

    Поля заголовка запроса.
    После строки запроса идут поля заголовка запроса. Поля общего(general-header) заголовка (он общий как для запросов так и для ответов):
    Date:
    Указывает дату запроса,например:
    Date: Sun, 20 Nov 1994 08:12:31 GMT

    MIME-version:
    Указывает версию MIME (по умолчанию 1.0)
    MIME-version: 1.0

    Pragma:
    Содержит указания для таких промежуточных агентов как прокси и шлюзы,
    Pragma: no-cache

    Поля относящиеся к запросу(Request-Header):
    Authorization:
    Содержит информацию аутентификации
    Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

    From:
    Браузер может посылать адрес пользователя серверу
    From: quake@doom.ru

    If-Modified-Since:
    используется при методе GET ресурс возвращается ,если он был изменен с указаного момента, может использоваться при кешировании.
    If-Modified-Since:Mon 15 Jul 1997 00:15:24 GMT

    Referer:
    Содержит URL предшествующего ресурса.
    Referer: http://www.uic.nnov.ru/

    User-Agent:
    Програмное обеспечение клиента.
    User-Agent: Mozilla/3.0

    Заголовок информации сообщения (Entity-Header) применяется как в запросах так и в ответах (при этом некоторые поля только в ответах):
    Allow: (в ответе сервера)
    Список методов,поддерживаемых ресурсом.
    Allow: GET, HEAD

    Content-Encoding:
    идентифицирует метод кодировки,которым был закодирован ресурс
    Content-Encoding: x-gzip

    Content-Length:
    Длина тела сообщения
    Content-Length: 102

    Content-Type:
    Содержит тип ресурса(MIME),для текстовых еще и кодировку символов(необязательно)
    Content-Type: text/html; charset=windows-1251

    Expires: (в ответе сервера)
    Дата окончания действия ресурса,применяется в кешировании для запрета кеширования устаревших ресурсов (в ответе)
    Expires: Tue, 24 Sep 1998 23:00:15 GMT

    Last-Modified: (в ответе сервера)
    Время последнего обновления ресурса
    Last-Modified: Tue, 23 sep 1998 13:48:40 GMT

    Другие поля:
    Поля Accept: указывают серверу выдавать только указаные форматы данных,которые клиент может распознать.
    Accept: text/html
    Accept: text/plain
    Accept: image/gif

    Поле Host: служит для того , чтобы указать, к какому хосту идет обращение. Данное поле не входит в число обязательных. Однако оно является необходимым в тех случаях, когда одному физическому серверу соответствует несколько виртуальных хостов. В этом поле тогда указывается какой из виртуальных хостов имеется в виду.
    Host: www.nnov.city.ru

    Примеры запросов: Ответ HTTP-сервера.
    Ответ идет от сервера.Состоит он из строки состояния и затем поля ответа Общий заголовок(General-Header) и заголовок тела сообщения (Entity-Header),которые уже описаны при обсуждении запроса. и еще идет заголовок ответа(Response-Header).
    Строка состояния имеет следующий формат:
    HTTP/version Status-Code Status-Phrase
    где HTTP/version версия,Status-Code -3х значный код,и Status-Phrase текстовая фраза, поясняющая код ,пример: HTTP/1.0 200 Ok
    ,200 -код означающий успешную обработку запроса,что и поясняет «Ok» Заголовок ответа состоит из полей:
    Location:
    Содержит URI ресурса,может быть использован для переключения клиента в другое место, если например ресурс был перемещен в другое место или на другой сервер.
    Location: http://www.uic.nnov.ru/newlocation/index.html

    Server:
    Информация о програмном обеспечении сервера
    Server: Apache/1.1

    WWW-Autenticate:
    Параметры аутентификации.
    WWW-Autenticate: Basic realm=»doomsday»

    Коды ответов HTTP.

    Код статуса Значение
    200 OK
    201 Успешная команда POST
    202 Запрос принят
    203 Запрос GET или HEAD выполнен
    204 Запрос выполнен но нет содержимого
    300 Ресурс обнаружен в нескольких местах
    301 Ресурс удален навсегда
    302 Ресурс отсутствует временно
    304 Ресурс был изменен
    400 Плохой запрос от клиента
    401 Неавторизованый запрос
    402 Необходима оплата за ресурс
    403 Доступ Запрещен
    404 Ресурс не найден
    405 Метод не применим для данного ресурса
    406 Недопустимый тип ресурса
    410 Ресурс Недоступен
    500 Внутренняя ошибка сервера
    (это по вашу душу,юные CGI-программисты ;( )
    501 Метод не выполнен
    502 Неисправный шлюз либо перегруз сервера
    503 Сервер недоступен/тайм-аут шлюза
    504 Вторичный шлюз/тай-аут сервера

    Более подробное описание всех кодов можно найти в RFC-1945
    Несколько примеров:
    CGI-заголовок.
    В том случае когда запрашиваемый URI есть CGI-скрипт сервер базируясь на данных запроса создает среду переменных CGI и передает управление скрипту скрипт должен выдать CGI-заголовок,после которого и идет тело ответа,сгенерированое скриптом.
    Заголовок (CGI-Header) состоит из полей:
    Content-Type:
    Должно обязательно присутствовать,если есть тело.
    Content-Type: text/html

    Location:
    Содержит URL ресурса на который скрипт перенаправляет запрос.Как правило,если присутствует это поле больше ничего не указывается.
    Location: http://www.idsoftware.com/index.html

    Status:
    Позволяет CGI скрипту вернуть статус обработки,если это поле не задано,то сервер подразумевает
    Status: 404 Not found

    На базе этой информации сервер и формирует окончательный заголовок,который и передается клиенту.
    Примеры: nph-скрипты.
    Иногда возникает необходимость чтобы CGI -скрипт сам отвечал напрямую клиенту, минуя разбор заголовка.Это во-первых уменьшает нагрузку на сервер,и во вторых, что самое главное такой прямой ответ клиенту позволяет скрипту полностью контролировать транзакцию.Для этого существуют nph-скрипты(Not Parse Header) ,имя скрипта должно начинатьс с префикса «nph-« ,Например «nph-animate.cgi» .Такие скрипты сами формируют HTTP-ответ клиенту,что полезно при анимации:
    Этот пример вам выдаст анимацию ,составленую из нескольких .gif -файлов.Если же вы получили вместо анимации сообщение об ошибках,то вам следует,может быть перейти к следующей главе, которая поведает вам о правах доступа- того,без чего Unix не был бы Unixом.

    Права Доступа

    Я бы ни за что не написал этот раздел,если бы он не был так важен.Сидя в пределах своей домашней директории и занимаясь только тем,что качаете с Инета всякую херню,вы возможно и не задавались некоторыми вопросами. а зря. Ведь немного надо,чтоб попортить нервы начинающему CGI -програмисту.
    Одна из таких вещей это права доступа.
    Начнем с того ,что в системе Unix каждый пользователь имеет свой идентификатор- число,уникально идентифицирующее его в этой системе.(Мой логин paaa а ему соответсвует число 1818).Это число внутреннее для операционной системы,для пользования оно представлено как логин,который и соответствует пользователю.
    Только не надо думать о пользователе,как о конкретном человеке сидящим за клавиатурой, пользователем может быть и какой-нибудь процесс.Важно отметить что пользователь-это определенна область прав доступа,которая ему соответствует.(Вы например не можете обычно писать и удалять файлы из каталога другого пользователя). Это и дает возможность стабильной работы всей системы.
    Итак есть идентификатор пользователя.Также имеется идентификатор группы.
    Группа служит для выделения пользователей по группам. Например у пользователей группы users (Обычные пользователи) не такие права как у группы wheels (административная группа).
    Каждый процесс который вами запущен(Будь то Netscape,терминал,или текстовый редактор)получают ваши идентификаторы пользователя и группы. таким образом исполняются от вашего имени.
    Теперь рассмотрим повнимательней файловую систему.В Unix с файлом связано много характеристик. Во-первых в системе нет «ничьих» файлов ,все файлы имеют владельца-пользователя и владельца-группу. Любой файл который вы создаете автоматически получает ваш идентификатор.По этому система очень легко отслеживает, чьи это файлы и каталоги.
    Следующее новшество по сравнению с DOS это права доступа к файлу.Их может сменить только тот пользователь которому принадлежит файл,или супервизор.(Это в отличии от DOS где каждая дрянь типа вируса может снять атрибут readonly читать и писать все файлы ;()
    Права доступа задаются обычно числом в восьмеричной записи и разбиты на 3 части по 3 бита: Каждая часть задает права доступа для конкретной группы:

    1я -права доступа для пользователя,которому принадлежит файл
    2я -для группы которой принадлежит файл
    3я -для всех остальных

    В каждой такой категории выделяются 3 права: Право на чтение,Право на запись,и право на исполнение. (все права и аттрибуты очень наглядно показаваютя командой ls с ключом -l) Так как исполнять каталоги бессмыслено,то право на исполнение для них означает право обращатся к файлам из этого каталога.

    Бит Описание
    8 Право на чтение для пользователя
    7 Право на запись для пользователя
    6 Право на исполнение для пользователя
    5 Право на чтение для группы
    4 Право на запись для группы
    3 Право на исполнение для группы
    2 Право на чтение для всех остальных
    1 Право на запись для всех остальных
    Право на исполнение для всех остальных

    Изменяются права командой chmod,ее синтаксис такой:
    chmod [u|g|o]<+|-> file
    chmod number file
    ,где uuser,ggroup,oother,rread,wwrite,x-execute;-удалить,+-установить
    Примеры:
    chmod +r file.txt #разрешает всем право на чтения файла
    chmod u+w file.txt #устанавливает для владельца файла право на запись в него
    chmod +x gbook.cgi #право на исполнение для всех,как для ползователя,группы,и для других
    chmod 0777 cgi-bin #Разрешает самые широкие права доступа для cgi-bin

    Приоткрытии файла программой,операционная система сравнивает идентификатор пользователя с идентификатором пользователя владельца файла, если они равны,то действуют права пользователя,если не равны то сравниваются идентификаторы группы,если и они не равны,то действуют права доступа для остальных остальных.В том случае если у процесса нет достаточных прав,система возвращает ошибку. Следует заметить ,что для супервизора root права доступа не проверяются.
    Можно выполнить скрипт,только если есть права на его исполнение. Вот почему следует давать chmod +x *.cgi иначе ваши скрипты станут просто недоступными. Но и это еще не все.
    Ваш скрипт может обращатся к вашим файлам (например ведет базу данных гостевой книги). Все выглядит нормально,но только ничего не работает,файл в который вы намеревались писать,
    не открывается,знакомая проблема ;(( ?.Так вот чтобы вы не мучались в догадках Ваш скрипт не может получить доступ к вашим файлам,потому что он выполняется не вами (не с вашим идентификатором), а от имени nobody (непривелигированый пользователь).Это мера предосторожности направлена на то, чтоб скрипты ,взбесившись из-за неправильно переданых параметров(или вообще от глюков) не могли ничего повредить ценного и важного на сервере.
    Поэтому к тем файлам,к которым скрипт по смыслу должен обращатся нужно присвоить самые широкие права доступа 0777
    Например в случае гостевой книги chmod 0777 guestbook.dat
    Если также важно чтоб скрипты могли заводить новые файлы в cgi-bin то надо дать также права на это chmod 0777 cgi-bin
    Если вы видите что ваш скрипт не может обратится к какому-то файлу,то это в 99% случаев из-за вашей забывчивости.
    На самый крайний случай воспользуйтесь setuid-скриптами (к этому делу ,если вы на это решились,отнеситесь ОЧЕНЬ серьезно,так как целые тома по безопасности в Unix посвящены именно setuid-программам). Хочу сразу предупредить ,сам я таких не так уж много писал,да и вам не особенно советую. Но для общего как говорится развития,имейте в виду следующую информацыю.
    Кроме указания прав доступа,существуют специальные биты у файла.Это биты установки пользователя и группы. Когда процесс выполняется(простой процесс) то его реальный и эффективный идентификаторы пользователей совпадают,идентификаторы групп тоже. На самом деле значение имеют как раз эффективные значения пользователя и группы,они учавствуют в сравнении прав доступа. Нельзя ли их как-то изменить,когда уж совсем нужда заставит? Можно! .На этот вопрос дают ответ программы с установленым битом пользователя.Когда система запускает такую программу,она присваивает новому процессу не идентификатор того пользователя,что запустил ее, а идентификатор пользователя-владельца исполняемого файла.
    Самый классический пример setuid-программ это программа passwd ,предназначеная для смены пароля пользователя. Такие данные как пароль и прочие характеристики пользователей хранятся в специальном файле,который имеет огромное значение при входе в систему. Так как это системный файл,то открыть к нему доступ на запись всем-значит подвергнуть ВСЮ систему риску,ведь любое неправильное изменение его повлечет катастрофические последствия(в конце концов бывает просто хулиганство). Поэтому доступ к этому файлу закрыт для всех пользователей.А что если надо сменить пароль? Запускаем программу passwd! Если глянуть на ее аттрибуты ,то видно что она принадлежит root -супервизору, и еще имеет установленый бит setuid. Так корректно обходится эта проблема.
    Если вы все-же решили попытаться ,то знайте ,что сделать программу setuid можно
    коммандой : chmod +s myprogramm

    И как всгда Примерчик напоследок:
    Эта программа выдает содержимое вашей директории public_html в том случае,если она доступна для чтения,и для каждого файла указывает ,можно ли его читать,писать и исполнять. Попробуйте ее сделать setuid и посмотрите как изменится результат.

    Генерация ответа

    Большую часть того что нужно знать о генерации ответа,я сказал в разделе Заголовки запросов и ответов.Нет,не угадали! Я не буду сдесь говорить о всяком дизайне того что вы выдаете.Этому вы успели напрактиковатся на HTML -страничках.
    Я поговорю о MIME (Multipurpose Internet Mail Extension).И о разных браузерах.
    Стандарт MIME появился в электронной почте (e-mail) потому что остро стала проблемма пересылки по e-mail различных данных в различных форматах.Так как HTTP тоже работает с различными типами данных то поэтому тоже использует MIME для своих нужд. Типы MIME состоят из Типа и подтипа (например text/plain,где text-указывает на наличие текстового содержимого,а plain-уточняет его как простой текст) приведеный ниже список (он далеко не полн,типов MIME огромное количество) описывает некоторые часто встречающиеся типы.: text/html text/plain text/richtext image/gif image/jpeg image/tiff audio/basic audio/32kadpcm audio/ video/mpeg video/quicktime multipart/mixed multipart/alternate multipart/ application/octet-stream application/msword application/postscript message/digest
    Информация о MIME больше возможно пригодится вам в том случае если вы собираетесь работать из ваших скриптов с электронной почтой,но и для WWW она не повредит. Особенно знание Content-Type:
    Content-Type:
    Состоит из типа и подтипа типы могут быть как стандартные так и экспериментальные начинающиеся с префикса ‘x-‘:

    text
    Текстовые данные.Первым подтипом который включен сюда это plain,что значит простой текст. сюда же включен самый ходовой формат html .У типа text как и у многих типов могут быть параметры,главным из них является charset он как раз и указывает на раскладку символов, которая применена в тексте, так что если вы хотите указать браузеру какую раскладку применять, то просто укажите charset:
    Content-Type: text/plain; charset=us-ascii
    Content-Type: text/html; charset=iso-8859-1
    Content-Type: text/html; charset=koi8-r

    multipart
    Данные которые могут состоять из нескольких частей,различных типов данных.Поэтому параметром multipart служит boundary, позволяюший указать разделитель.Каждый фрагмент в многочастевом сообщении имеет свой Content-Type: (Он может быть также multipart,т.е. допускаются вложеные multipart,главное чтоб boundary были разными).В электронной почте применяется больше multipart/mixed (основной подтип) и multipart/alternative (Он отличается тем что показывается одна из альтернатив,например сообщение шлется в простом и HTMLом форматах,и почтовая программа показывает либо часть,которую она способна отобразить). В WWW -програмировании распостранен x-mixed-replace ,который означает что следующая часть должна заменить предыдущую после подгрузки, что применяется для анимации(см.Пример с анимацией).
    Теперь о разделителе,его надо выбирать так,чтоб он не встретился где-то в данных (т.е. что-то вроде «diUr344rnmvforgefvrg923rghyj2»).Когда вы задали разделитель,например boundary=»boundary» то когда закончилась одна часть,вы должны выдать строку —boundary,последн часть —boundary—,причем эти разделители должны быть на отдельной строке,а не сливаться с текстом:
    Пример:

    message
    Представляет инкапсулированое почтовое сообщение.Используется в e-mail ,а не в WWW.

    image
    Некоторое Графическое изображение.(чаще всего image/gif и image/jpeg)

    application
    бинарные данные какого-нибудь приложения.В том случае если данное приложение может быть запущено,Браузер запускает его.Например при поступлении данных application/msword Браузер спросит,нужно ли запустить Word для просмотра досумента.При отсутствии нужного приложения браузер спросит в каком файле сохранить данные.Подтип octet-stream как раз и означает поток байт информации,который и используется по умолчанию.(К сожалению не все так гладко,известен глюк в Netscape Navigator‘е который вместо того чтоб сохранить application/octet-stream пытается его показать как text/plain что если это сгенерировано из CGI,ни к чему хорошему не приводит ;(()
    Что касается application ,то Вы можете тут смело извращатся,используя x- типы данных,
    Например application/x-fuck-to-netscape-navigator. ;)))))
    Часто используемый параметр name позволяет указать имя файла.Например:
    Content-Type: application/msword; name=»readme.doc»
    Что полезно при полученнии файлов через HTTP,причем этот параметр может применятся и для других типов таких image или audio ,Например:
    Content-Type: image/gif; name=»myfoto.gif»

    Content-Transfer-Encoding:
    Применяется больше в системе электронной почты и обозначает метод кодирования, которым были закодированы данные при передаче сообщения.Например:
    7bit 8bit quoted-printable base64 binary x-типы
    MIME-Version:
    Указывает версию MIME .

    Теперь поговорим о разных браузерах вы знаете что браузеры бывают разные,разных версий на разных платформах, поддерживают и не разные тэги и глюки у них тоже разные. ;((( .
    Это могло попортить много нервов WEB-дизайнерам и конечно же нам ,CGI-програмистам. Профессионально написаный сайт от просто хорошего отличается тем что хорошо выглядит Не только на экране того браузера,которым пользуется сам его автор,а на других тоже.
    Если вы используете JavaScript для своих страничек,то вы уже наверно использовали (или хотя бы вам в голову приходила мысль использовать)свойства navigator.AppName navigator.AppCodeName navigator.appVersion navigator.userAgent:
    Ну не волнуйтесь вы так ,мы CGI-программисты не в самых худших условиях на этот счет. Вспомните о том что браузер сам при запросе посылает вам данные о себе и о своей версии. И делает он это для того,чтобы эту информацию можно было учесть.
    В запросе он указывает User-Agent: которое и попадает на сервере в переменную среды HTTP_USER_AGENT ,которую и можно использовать.
    Например если в ней содержится Mozilla/3.01Gold (Win95;I) то значит вы имеете дело с Netscape (Mozilla-кодовое название Netscape Navigator‘а),версии 3.01Gold и далее после имени и версии может следовать необязательная информация ,например как в приведеном примере о платформе Win95 и о том является ли версия U -для США (USA) или I -международной(International). Напомню,что такая информация необязательна.(То есть если браузер послал информацию User-Agent: то гарантировано расчитывать вы можете только на Название/Версия).
    Ну вот я слишком много развел демагогии,пора переходить к практическим примерам.
    Допустим ваш скрипт генерирует какие-то тэги,которые слишком старые браузеры не поддерживают,причем без них не обойдешся,они составляют всю ‘изюминку’ сайта.
    Ну уже почувствовали,насколько это здорово.А вот еще примерчик.Это из разряда того, что тэги бывают разные.Например в Explorer есть тэг BGSOUND предназначеный для проигрывани музыки на страничке.(В Netscape этого тега нет,и поэтому для втыкания музыки приходится использовать подключаемые модули plugin).Мутится с этими Плугинами Вам в облом,а хочется побаловать человека хорошей музыкой,если браузер позволяет. Ну вот вы уже можете управлять этим процессом.Только не забывайте,что если вы не получили информацию о клиенте(так может быть,если например ваш скрипт вызвал какая-нибудь поисковая машина) то не в этом случае не надо делать никаких предположений,а просто пусть ваш скрипт продолжает делать то что должен был делать.

    Как всегда Примерчик на последок.Этот примерчик позволит выбирать из списка файлов. и загружать что пользователь хочет.

    Обработка Форм

    Ну вот ,вы уже знаете достаточно,кое в чем уже успели приобрести опыт, пришло время перейти к очень важной теме — обработке форм. При всей простоте (кажушейся) это едва ли не самое главное предназначение всего стандарта CGI . Куда бы вы не зашли на любой уважающий себя сайт,везде вы встретите формы, которые вам предложат заполнить.В этом деле можно положится только на CGI, так как Java и JavaScript ,выполняющиеся на страничке у клиента не имеют доступа к серверу,на котором находится сайт.
    Коротко вспомним о том что происходит при рассматриваемом процессе поближе,так сказать на трезвую голову 😉. Итак браузер требует у сервера определенный URL (это может быть как простой документ,так и сгенерированый CGI) в этом документе может содержаться форма.Отображая такой документ браузер также выводит элементы формы (кнопки, поля ввода, поля ввода пароля, переключатели, радио-кнопки, списки, текстовые области,скрытые поля). И со всем этим добром пользователь может взаимодействовать.К форме естественно имеет доступ и встроеный язык программирования JavaScript -он может как использовать форму для своих нужд,не передавая CGI,так и помогать пользователю в заполнении формы.
    После того,как пользователь заполнил форму он нажимат кнопку Submit которая говорит, что форму надо отправить на сервер. Браузер собирает все имена и значения элементов формы ,кодирует их методом urlencode и в зависимости от указаного в тэге FORM метода вызывает GET или POST с указаным URL,передавая ему данные. На сервере CGI-скрипту это попадает (в зависимости от метода) либо в переменную QUERY_STRING либо на STDIN.Скрипт может проверить данные ,занести их в какую нибудь базу данных,может как yahoo выполнить какой-нибудь поиск, может что-нибудь вычислить. да мало ли что он может,все зависит только от нашей фантазии. В конце концов скрипт выдает браузеру ответ,который он и отображает.В этом ответе может содержаться все что вашей душе угодно от сообщения об удачном или неправильном запросе до таких ответов,по сравнению с которыми yahoo и altavista подвиснут от зависти, главное чтоб вам и тем кто посещает ваш сайт это нравилось.😉

    Ну а теперь немного о синтаксисе элементов форм ,их описании и самое главное особенностях при обработке CGI-скриптом.
    Итак немного экскурс в HTML:
    FORM
    Атрибуты:
    action
    как раз и задает тот URL,который будет и обрабатывать форму, если он опущен,то текущий URL документа(а он-то может быть сгенерирован нашим скриптом).
    method
    задает метод GET или POST
    enctype
    обычно не задается,для форм он application/x-www-form-urlencoded -по умолчанию, и поддерживается всеми CGI скриптами.Но если вы уж очень хотите чтобы браузер послал вам данные в другом формате (например text/plain) то можете указать этот тип кодировки,только потом не жалуйтесь,что ваш скрипт не может разделить поля,или вообще начинает глючить когда пользователь ввел какой-то спецсимвол.
    name
    Задается для JavaScript,чтоб обращатся к форме по имени,а не по номеру. Для CGI не играет ни какой роли,так как внутреннее для браузера.
    target
    Может Определять в какой фрейм отправить полученую информацию.Имеет значение во фреймосодержащих документах.Прозрачен для CGI обработки данных.
    onSubmit
    Определяет JavaScript -обработчик активизации формы.Применяется для проверки JavaScript‘ом правильности заполнения.Опять таки прозрачен для CGI.
    Пример типичной формы: Форма может содержать элементы.Элементы имеют имена,которые используются дл кодирования пар имя=значение.Некоторые Элементы не передаются CGI,а используются JavaScript для управления,например кнопки.Некоторые поля передаются только в тех случаях, когда в них что-то выбрано,например списки и переключатели.Остальные поля передаются всегда, даже когда они пустые.
    Например: Допустим вы ввели имя lesha и адрес paaa@uic.nnov.ru,при этом выбрали переключатель После нажатия кнопки будет отправлен вот такой запрос:
    http://www.doom/cgi-bin/test.cgi?Name=lesha&Email=paaa@uic.nnov.ru&doomer=Yes
    Если же вы не выбрали переключатель,то запрос будет таким:
    http://www.doom/cgi-bin/test.cgi?Name=lesha&Email=paaa@uic.nnov.ru
    ,как видите элемент doomer не вошел в строку запроса
    Теперь попробуйте оставить поля редактирования пустыми:
    http://www.doom/cgi-bin/test.cgi?Name=&Email=
    Эти элементы (Name и Email) присутствуют и сообщают что они пустые.

    Кнопка(button)

    В форме изображается кнопка,при нажатии которой вызывается JavaScript-обработчик заданый атрибутом onClick ,атрибут name служит для JavaScript-именования кнопки а не дл передачи CGI.Так как значение кнопки не передается CGI, value задает Текст,изображаемый на кнопке.

    Submit

    Кнопка,предназначеная для передачи формы.Опять же,сама не передается,а служит только для управления. текст на ней задается атрибутом value.
    Reset

    Кнопка очистки формы.При ее нажатиивсем измененым элементам возвращается значение по умолчанию.
    Поле ввода(text)

    Применяется очень часто,поэтому тип «text» служит для INPUT по умолчанию,его не надо каждый раз указывать.Имя поля,задаваемое name является обязательным для CGI (в отличии от JavaScript,где элементы формы можно индексировать по номерам,а имена для удобства и читабельности кода служат).Можно задать значение по умолчанию атрибутом value,которое будет после загрузки докумета.атрибут size позволяет задать размер поля.Также может содержать обработчики onBlur,onChange,onFocus,onSelect.
    Текстовая Область(textarea)
    Область многострочного редактирования.Размеры в строках и столбцах задаютс атрибутами rows и cols.Значения атрибута wrap «hard» и «soft» -означают соответственно мягкую или жесткую разбивку на строки (в большинстве случаев ето не существенно). На что следует действительно обратить внимание так это на символ,используемый для указания перехода на новую строку. В Windows это ‘\r\n’ а в Unix ‘\n’,так что если это для вас существенно,то приводите преобразование,например так:
    $my_text =

    s/\r\n/\n/g;
    Поле ввода пароля(password)

    Очень похоже на поле ввода,отличается тем что вместо символов в нем отображаютс символы ‘*’.Служит для ввода пользователем пароля.
    Скрытое поле(hidden)

    Поле не отображаемое на экране.Но оно имеет имя и значение и следовательно передается в форму. Служит для того (и очень часто програмисты его применяют) чтоб передавать скрипту какую нибудь информацию.Например,если ваш скрипт обрабатывает несколько форм разных типов,то в скрытом поле каждой формы можно указать с какой формой конкретно вы имеете дело. Так как это ваша внутренняя кухня то нечего пользователю мозолить глаза этой информацией.
    Переключатель(checkbox)
    Text
    В отличии от кнопки,атрибут value сдесь не задает на надпись на переключателе,а его значение(внутреннее).Поэтому если надо что-то подписать,пишите рядом в ним. Может быть сразу выбраным если указан атрибут checked .Если value не указано то значение по умолчанию «on» .Передается только в том случае,когда выбран.
    Радио-кнопка(radio)
    Text
    В отличие от checkbox может быть несколько радиокнопок с одинаковым параметром name ,но с разными value,из них передается только та,что выбрана.Одна из них может быть изначально выбрана по умолчанию checked.Например:
    Список(select)
    Задает список,позволяющий выбрать одну (или несколько) опций из списка. Если атрибут multiple не указан,то создается простой выпадающий список,в котором можно выбрать только одну из опций.Его значение всегда передается,т.к. всегда хоть одно выбрано. Если указан атрибут multiple,то во первых можно указать размер видимой части списка атрибутом size (Если опций больше появится скролинг).Во вторых передаются только выбраные опции ,т.е.Он может передатся несколько раз ?SelectName=opt1&SelectName=opt2&SelectName=opt9 если выбраны скажем несколько опций.А может и не разу,если ничего не выбрано из списка. Можно задавать обработчики onBlur,onChange,onFocus.
    Небольшая Помощь JavaScript
    Для CGI-програмиста конечно JavaScript -это иной мир,вы можете спокойно пропустить этот абзац,если вы не знаете JavaScript,так как написаное в нем к CGI не относится, а скорей к самим формам и дизайну сайта.Я скажу пару слов о том как JavaScript может оказать посильную помощь в проверке правильности заполнения форм.Все проверки конечно можно и нужно делать на сервере,но когда имеешь дело с рассеяным пользователем, то для него заполнение простой формы превратится в мучение.Поясню на примере,в форме есть какие-то обязательные поля,например имя.Если пользователь забыл его указать то скрипт скажет ему об этом в сообщении он исправит это, допустим что-нибудь еще не так ввел . Только на передачу данных по сети может уходить масса времени.А на обработку на локальной машине-доли секуды.
    Вот Например как это можно применить JavaScript для предварительного контроля правильности. Допустим простейшая форма содержит имя и возраст.Имя не должно быть пустым, а возраст должен состоять из цифр. Ну вот ,на этом можно закончить это краткое введение в HTMLые формы.
    Итак,У нас на входе скрипта данные формы,закодированые методом urlencode Положеные в Переменную QUERY_STRING или подаваемые на STDIN.Мы должны вопервых их получить. Вот,мы уже считали наш запрос в переменную $query.Теперь пришло самое время ее обработать. Мы знаем что поля разделены символом ‘&’ значит используем его в качестве разделителя функции split: Вот разделили,а теперь организуем цикл foreach по полученым полям @formfields Сдесь выражение в регулярном выражении в круглых скобках (.*) после знака ‘=’,запоминаетс в скалярную переменную $1 ,которая затем и декодируется нашей старой и знакомой функцией urldecode (я предупреждал,что она будет почти в каждой вашей CGI-программе) Так мы проходим по всем полям,которые нам переданы.Это стандартный подход,он годится в качестве шаблона.У вас может возникнуть вопрос,а что делать если вам переданы данные от списка у которого задана возможность выбора нескольких элементов и данные поступают в таком виде: Sel=opt1&Sel=opt2&Sel=opt9. Тут тоже нет никаких проблем,просто запихиваем эти поступающие значения в массив. И потом спокойно оперируем с Полученым Массивом @Sel.
    На этом можно так сказать заканчивается шаблонная часть скрипта и начинается содержательная, которая зависит только от вашей фантазии.
    Вы можете сколько угодно анализировать полученые значения,обращатся при этом к различным файлам .Если вы к этому приложите фантазию,то кто знает что получится.
    А Пока Ради примера я вам напишу скрипт,который ведет социологическое исследование насчет курения и отношения к нему.Может он слишком массивен для данного пособия, но зато он наглядно показывает как достаточно простыми средствами можно проводить социологические исследования. А вот скрипт для его обработки:

    Изображения ismap

    Анимация

    Когда говорят о каком-то популярном сайте,то частенько к преимуществам относят и анимацию. Действительно,когда изображение изменяется (и особенно к месту 😉),то это смотритс и пользователю нравится.
    Говоря об анимации нужно сразу отметить что нет лучшего способа. Анимацию можно сделать ДЕСЯТКАМИ Способов,каждый хорош в своей области применения. Я перечислю только некоторые из них,которые чаще всего применяются:
    Самый простой,но наименее функциональный способ это GIF с анимацией.
    Потом можно воткнуть анимационный файл MPEG или AVI они более отражают суть анимации, но имеют недостаток,что для проигрывания их на некоторых браузерах нужны специальные подключаемые модули.К тому же они не интерактивны.
    Можно реализовать анимацию в рамках Java-апплета,когда апплет находясь на страничке сам перерисовывается со временем.
    Таким же интерактивным средством служит обращение к массиву document.images[] из JavaScript.Достоинство-помимо интерактивности,полная интегрированость с HTML -станичкой.Но может как и предыдущий использоваться только с относительно новыми браузерами,которые поддерживают Java и JavaScript.

    В общем в каждом случае выбор остается за вами.Вам решать насколько тот или иной способ хорош в вашей ситуации.Я же познакомлю вас с еще одним.
    Вы даже уже были знакомы с этим способом,когда я вам рассказывал о nph- скриптах Теперь когда вы уже так много знаете,можно модифицировать тот пример, добавив в него вызов картинки по случайному принципу: Конечно одно из самых примитивных применений такой системы.Более мощным примером могло бы послужить отслеживание на сервере какого-нибудь периодически изменяющегося файла и пересылка пользователю обновленной версии.
    Такая Система применяется например в Чате,при появлении новых сообщений. Чатовая система достаточно сложна для этого пособия и я не стал сюда ее включать.Однако,если вам очень интересно,то я с удовольствием пришлю ее вам.

    Несколько советов по отладке

    CGI-программы -не самые простые в отладке,по сложности отладки они способны сравнится лишь с отладкой драйверов. Вся сложность заключается в том,что скрипт выполняется не как обычная программа. Он выполняется в специальной среде сервера,которая создается при клиентском запросе, к тому же он исполняется не из под вашего аккаунта,а на непривилегированом уровне.
    Если скрипт не исполняется потому,что вы допустили синтаксические ошибки,то самих этих ошибок вы не увидите,на экране будет только из-за чего она произошла вы можете только гадать. Также если вы забыли задать к какому-то файлу нужные права доступа ,то тоже будет трудно выяснить что же произошло и в чем причина ошибки (если конечно к этому вы не готовы).
    Ну вот ,хватит вас пугать,тем более что нас не запугаешь 😉 !
    Приступим к отладке.Я вам опишу достаточно примитивные меры,которыми я сам пользуюсь.
    Начнем с того что у нас есть скрипт test.cgi мы уже сделали его исполняемым chmod +x test.cgi Простейший способ проверить его на ошибки это команда Ключ -c говорит Perl что надо только проверить синтаксис.Все сообщения об ошибках вы можете видеть и подправить.Более тяжелый случай состоит в том когда Perl встроен в Web -Сервер, причем версии разные.Как у до недавнего времени было на uic‘е ;(( ! Тот Perl с которым работаем в командной строке 4й версии ,а на сервере стоит 5й версии.Если ваша CGI-программа использует при этом какие-нибудь преимущества 5-й версии (например обьектно-ориентированые модули),то вы думаете отладить ее низ -ошибаетесь!.Только приготовтесь к тому, что я сейчас скажу,вы сядте,а то упадете ;)) :
    Закоментируйте всю вашу программу ,т.е. перед каждой строчкой поставьте символ ‘#’. После чего,добавьте вот такие строчки: ,Должно получится так: А теперь запускайте скрипт.Естественно он выдаст Одно только слово ‘Test’. Разкоментируйте несколько строчек.Еще раз запустите скрипт.Он опять выдаст ‘Test’. Значит синтаксически эти только что разкоментированые строчки были правильные. И так далее.
    Если очередной раз после раскоментирования вы запустили скрипт и получили ‘Internal Server Error’ — значит в этих строках содержалась какая-та синтаксическая ошибка. Это способ отловки синтаксических ошибок трудоемок,но к нему придется прибегнуть если ваш скрипт писан под ту версию Perl,что на сервере,а не под ту что у вас.
    Узнать версию Perl можно
    Ну вот мы отловили в нашем скрипте все синтаксические ошибки,он заработал, но это не значит,что он работает правильно.
    Что еще можно посоветовать при отладке CGI-скриптов от ошибок возникающих во время выполнения программы. Допустим какой-то файл не открылся.Конечно показывать перепуганому пользователю эти технические подробности никчему,поэтому заведите себе специальный файл debug.txt и пусть ваши скрипты пишут в этот файл причины своих ошибок и сбоев, да и вообще о всех непредвиденых событиях.
    Это можно реализовать так: Примеры использования (Напомню,что встроеная переменная Perl $! содержит сообщение о причине последней ошибки,поэтому включайте ее всегда в свои сообщения): Потом можно периодически заглядывать в этот файл debug.txt и смотреть,какие ошибки встречались при работе ваших скриптов.Таким образом ваши скрипты сами помогать будут в своей отладке 😉.

    Также очень может оказать помощь (может и не оказать) просмотр http‘шных логов. Все обращения к URL на сервере и все возникающие при этом ошибки идут в логи сервера httpd. Сразу хочу предупредить — размеры этих логов даже на средних размеров сервере достигает десятков мегабайт. Поэтому даже не пытайтесь их вот так просто посмотреть.- Лучше если вы уж за данное дело взялись — воспользуйтесь такими утилитами как grep,head,tail,more,less. .

    Кстати я хочу сказать о причине еще одной (совсем не очевидной) ошибки.Если вы набрали скрипт у себя дома на компутере,то полученый скрипт состоит из текста в DOS‘ом формате, а не в Unix‘ом так что имейте это ввиду. Запускать вам его придется в системе Unix , так что следует перевести програмный текст в нужный формат.
    Дело в том что в системах DOS и Windows (это уж очередной раз скажите все что вы думаете о Билле Гейтсе и Ко) для разделения строк используетс не один («\n»),а пара символов («\r») и («\n»). Для простых HTML-файлов это не критично — браузеры игнорируют такие символы при выводе. Но скрипт является ПРОГРАММОЙ. А в программе никаких символов возврата каретки быть не должно!! Особенно в первой строке. Потому что когда операционная система запускает скрипт, она определяет какое приложение запустить для обработки данного скрипта именно по первой строке. В первой строке как вы знаете содержится #!/usr/bin/perl или #!/usr/local/bin/perl .Поэтому при запуске скрипта mysrcipt (это кстати вы можете сами увидеть коммандами top и ps) Система запускает комманду .А теперь представьте что будет если не убрать символ возврата каретки из Windows-файла. Получиться и естественно что такого приложения нет, и следовательно попытка выполнить коммаду ни к чему не приведет.
    Как с таким злом бороться я раскажу в моей следующей главе.

    Trics and traps

    Примеры приложений:

    Кто посещает мою страничку?

    Гостевая книга

    Счетчик посещений

    Наверное тоже одним из часто встречающихся приложений CGI являются счетчики посещений. Они стоят практически на каждой страничке, возможно даже и у вас. Но иногда вас не устраивает тот факт, что счетчик лежит где-то в другом месте.Из-за этого скажем невозможно начать счет с произвольного числа.Или еще некоторые счетчики по разному фильтруют ‘Reload’. Да и мало ли? Ну а иногда вам хочется просто сделать другой дизайн цифр. То если вы CGI-програмист то возможно имеет смысл написать свой счетчик. И делать с ним что захочется. Вот я так-же написал.
    Скрипт данного счетчика обслужевает несколько счетчиков ,им вы присваиваете идентификаторы. Поэтому вы спокойно можете втыкать независимые счетчики в разные страницы сайта и даже давать это делать друзьям. В общем он прост в использовании: , Где name -любое уникальное имя идентифицирующее счетчик.Вытакже можете задать необязательный параметр dig который задает количество цифр в счетчике ,Например:

    .gif‘ы в счетчике с прозрачными областями.Что дает дополнительную гибкость к примеру для улучшения внешнего вида с помощью другого фона его иногда имеет смысл запихнуть в «таблицу»:

    Свои данные он пишет примерно в такой файл counter.dat: Вы спросите,зачем столько информации? Чтобы отфильтровывать нажатия Reload. Если с одного IP-адреса между заходами промежуток меньше чем 30 секунд,то счетчик не инкрементируется (Так например поступает счетчик в Rambler‘е).
    Теперь об исходнике. Скрипт получился великоват,потому,что сдесь большую часть занимает генерация .gif — файлов.. Выглядит громоздко , зато пашет как трактор ;))!! Если вам циферки не понравились вы их легко сможете заменить.

    Вместо заключения

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

    Perl и CGI программы

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

    Создание CGI скрипта для примера на Perl

    В программе Notepad++ создайте новый файл и введите следующие строки:

    После, сохраните этот файл с расширением .pl (тип файла: Perl source file).

    Первая строка данного кода, указывает путь к интерпретатору CGI скриптов. Остальные, непосредственно исполняемый код.

    Загрузка CGI скриптов на сервер

    Мы воспользуемся популярным FTP клиентом FileZilla (можно скачать здесь). Войдите в вашу учетную запись на FTP сервере (как это сделать, можно узнать здесь). В правой панели перейдите в каталог cgi-bin вашего домена (путь будет выглядеть так: /domains/your-domen.ru/html/cgi-bin/).

    В верхнем меню, перейдите в Передача – Тип передачи, и убедитесь что установлен режим ASCII .

    После этого, в левой панели, на вашем файле скрипта нажмите правую кнопку мыши и выберите Загрузить на сервер. Файл будет загружен на сервер, далее, уже на правой панели на файле скрипта нажмите правую клавишу мыши и выберите Изменить атрибуты. Необходимо проверить права на ваш CGI -скрипт. Они должны быть установлены в значение -rwxr-xr-x или 755.

    Подробнее о правах доступа

    Значение прав доступа файла определяет тех кто имеет право на редактирование и исполнение файлов. Права доступа файла определяются в CHMOD файле. Права доступа можно изменить большинством популярных клиентов FTP или через, встроенный в панель управления, Web FTP.

    Наиболее, часто используемые, уровни доступа к файлам:

    Ошибки работы скрипта

    Для корректной работы, необходимо проверять скрипты перед тем, как помещать их на веб-сервер. Если в скрипте есть ошибки, то, запустив скрипт в unix shell, Вы сможете понять чем недоволен интерпретатор Perl .

    Ошибка 403 Если при обращении к скрипту Вы видите сообщение об ошибке 403, это значит, что на скрипт установлены некорректные права доступа. На CGI -скрипты необходимо установить атрибут исполнения (права доступа 755 или -rwxr-xr-x).

    Мастер Йода рекомендует:  Include, Require и комментарии PHP
    Добавить комментарий