Дарова, кулкодер $%)!

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

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

<FORM NAME="PINGWIN_FORM" ACTION="/cgi-bin/pingwin.pl"
METHOD="POST">
<INPUT TYPE=TEXT NAME="COLOR"><BR><BR>
< INPUT TYPE =SUBMIT VALUE=SUBMIT><br>
</FORM>

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

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

@pairs = split(/&/,$buffer);
foreach $pair(@pairs) {
($name, $value) = split(/=/,$pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9] [a-fA-F0-9])/pack("C", hex($1))/ge;
$FORM{$name} = $value; }

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

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

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

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

$COLOR = $FORM{'COLOR'};

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

Теперь разберем метод 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
. Зная это, можно самому, без формы
обращаться к скрипту, указывая параметры и
значения в адресной строке своего браузера.
Очень полезно, когда требуется создать
ссылку на скрипт с определенными
параметрами. Но из-за этой особенности
меняется и код опознания параметров. Он
имеет следующий вид:

$temp=$ENV{'QUERY_STRING'};
@pairs=split(/&/,$temp);
foreach $item(@pairs) {($name,$ value)=split (/=/,$item,2);
$ value =~tr/+/ /;
$ value =~ s/%(..)/pack("c",hex($1))/ge;
$FORM{$name}=$value;}

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

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

print "Content-type: text/html\n\n";

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

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

Print <<HZ ;
Строка1
Строка2

СтрокаN

HZ

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

Если я тебя не убедил, что эта конструкция
намного удобней стандартной, то для
наглядности приведу пример простейшего HTML-документа,
используя оба метода:

print "<html><head><title>31337 Example</title></head>\n";
print "<body><font color=\"#000000\" size=\"1\"
face=\"Verdana\">Типа здесь будет текст…\n"; 
print " <br>А теперь строчкой ниже…\</font>\n";
print "</body></html>";

Вставление обратной косой \ перед двойными
кавычками является обязательным. А теперь
тоже, но методом here-документ:

print <<HTML;
<html>
<head><title>31337 Example</title></head>
<body><font color="#000000" size="1" face="Verdana">Типа
здесь будет текст…
<br>А теперь строчкой ниже…</font>
</body>
</html>
HTML

Никаких обратных косых не надо и вообще
ничем не отличается от обычного написания
HTML. Думаю, убедил. Разница, на мой взгляд
очевидная, но почему-то, часто встречаются
скрипты, где выводятся первым методом и
гораздо более сложные документы…

Теперь, можно собрать всё это в одно целое.
Допустим, у нас была та форма про цвета,
использовался метод GET, а в поле COLOR чел
написал RED и нам нужно, чтобы скрипт выводил
значение, введенное пользователем. Тогда
полный код скрипта будет таким:

#!/usr/bin/perl

$temp=$ENV{'QUERY_STRING'};
@pairs=split(/&/,$temp);
foreach $item(@pairs) {($name,$ value)=split (/=/,$item,2);
$value =~tr/+/ /;
$value =~ s/%(..)/pack("c",hex($1))/ge;
$FORM{$name}=$value;}

$COLOR = $FORM{'COLOR'};

print "Content-type: text/html\n\n";

print <<HTML;
<html>
<head><title>31337 Penguin</title></head>
<body>
<font color=#000000 size=2 face="Verdana"> Наш пингвин
цвета $COLOR</font>
</body>
</html>

HTML

Результатом будет вывод "Наш пингвин
цвета RED"

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

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии