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

CGI-сценарии

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

$fonn_data =~ s/%(..)/pack ("С", hex ($l))/eg;

Образец для поиска задан в виде регулярного выражения %(..). Этому образцу удовлетворяет произвольная последовательность вида %ху, где х, у – любые символы. В результате кодирования данных в качестве х, у могут появиться только шестнадцатеричные цифры, поэтому можно не задавать более точный, но менее компактный шаблон %([0-9A-Fa-f][0-9A-Fa-f]j. Часть выражения заключена в скобки (..). При нахождении подходящего фрагмента %hh его часть, содержащая шестнадцатеричное число hh, сохраняется в переменной, которая затем будет использована в качестве аргумента функции hex($ij для преобразования в десятичное значение. Функция pack упакует это десятичное значение в двоичную структуру, которая в соответствии с шаблоном "с" будет интерпретироваться как символ. Этот символ заменяет в тексте найденную цепочку %hh.

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

Пример создания собственного CGI-сценария

Программа должна декодировать полученные данные, проверять заполнение обязательных полей формы и правильность подтверждения пароля, в зависимости от результатов проверки формировать документ для отсылки клиенту. Сохраним сценарий в файле /cgi-bin/registrar, cgi. Полный маршрут к данному файлу определяется параметрами конфигурации Web-сервера. Местоположение каталога cgi-bin обычно указывается относительно корня дерева документов Web-сервера, а не корневого каталога файловой системы. Например, если корнем является каталог /home/httpd/htmi/, то файл сценария будет иметь маршрутное имя /home/httpd/html/cgi-bin/registrar.cgi, которое в запросе клиента будет указано как /cgi-bin /registrar.cgi. В первом приближении текст сценария может выглядеть следующим образом.

#!/usr/bin/perl
print "Content-type:text/html\n\n"; $method = $ENV{'REQUEST_METHOD'};
 if ($method eq "GET") { ^
$form_data = $ENV{'QUERY_STRING'}; } else {
read (STDIN, $form_data, $ENV{'CONTENT_LENGTH'}); }
$form_data =~ s/%(..)/pack ("C", hex ($l))/eg; $form_data =~ tr/+/ /;
 @pairs = split (/&/, $form_data); foreach $pair (Spairs) {
($name, $value)=split(/=/,$pair);
$FORM{$name}=$value;
Проверка заполнения обязательных полей
if (!$FORM{'regname'} I I!$FORM{'passwordl'}) { print "goback
<html>
<head><title>Невведенные данные </title></head>
<body><h2>Извините, Вы пропустили обязательные данные</п2>
<br>
<а href=" http://www.klf.ru/welcome.Мл11 ">Попробуйте еше раз, пожалуйста</а>
</body>
</html> goback;}
#Проверка правильности ввода пароля elsif ($FORM{'passwordl'}
eq $FORM{'password2'}){ print"confirmation <htrml>
<head><title>no3flpaBnHeM!</titlex/head> <Ьойу><h2>Поздравляем! </h2><br>
Ваша регистрация прошла успешно. Вы можете пользоваться нашей библиотекой. Спасибо за внимание.
</body>
</html>
confirmation
;}
else {
print"new_form
<htmlxhead><title>Oira6Ka при вводе napc"w</titlex/head>
<ЬойуХпЗ>Введенные Вами значения пароля не совпадают
<br><form method="get" action="/cgi-bin/registrar.cgi">
<pre>
Введите пароль: <input type="password" name="passwordl">
Подтвердите пароль: <input type="password" name="password2">
</pre>
new_form
foreach $key (keys %FORM) {
if ($key ne "passwordl" && $key ne "password2") {
print "<input type=\"hidden\" name=$key value=$FORM{$key}>\n";
} } print "EndOfHTML
<br><br>
<input type="submit" value="OK"> <input type="reset" value="Отменить">
<i / form></body></html> EndOfHTML;)

После вывода строки заголовка осуществляется считывание переданной серверу информации в переменную $form_data. В зависимости от метода передачи, эта информация считывается из переменной среды QUERY_STRING (метод GET) или из стандартного ввода программы (метод POST).

Считанная информация декодируется и помещается в ассоциативный массив %FORM.

Отсутствие обязательных данных – регистрационного имени и пароля – проверяется С ПОМОЩЬЮ УСЛОВИЯ if (! $FORM{' regname'} I I! $FORM{ 'passwordl'}).

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.