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

Автор: Topol Суббота, Август 11th, 2012 Нет комментариев

Рубрика: Perl

Автор не будет себя утруждать вводным курсом PERL. Для этого в Сети огромное количество материала. Здесь делается акцент на особенности программирования скриптов на PERL.

На данный момент PERL является одним из самых лучших языков CGI-программирования для Web-серверов на базе Unix. Для других платформ этот язык тоже годится.

Любой CGI-скрипт должен формировать заголовок ответа. Как это делается на PERL? Очень просто

print "Content-Type: text/html ";

Такой заголовок мы формируем, если наш скрипт будет выводить данные в формате HTML.
Если наш скрипт при своем выполнении будет совершать какиелибо действия, но требуется не вывод а переадресацию на какую-нибудь страницу или сайт, то пишем

print "Location: http://kuda_nibud.tuda ";

Скрипт сделает свое дело и перенаправит пользователя на адрес указанный после Location.

Теперь несколько замечаний по размещению скриптов на сервере.
Обычно скрипты размещаются в директории cgi-bin. Хотя это не всегда так. Ваш скрипт должен иметь права на запуск в системе (это о Unix). Делается это командой chmod +x script.cgi.

А теперь можно и начинать писать скрипт, и начать следует с приветствия миру.

Итак, простейший скрипт:

#!/usr/bin/perl print "Content-Type: text/html "; print "<h1>Hello World</h1>";

Первая строка указывает путь к интерпертатору PERL в системе (здесь указан путь, где обычно находится PERL в системе Unix.
Вторая строка выводит заголовок.
А вот третья строка передает браузеру данные, которые браузер обрабатывает соответственно типу, переданному в заголовке.

- ХА!!!! — скажет многоуважаемый посетитель — А не проще ли просто набрать HTML файл без всяких там скриптов?

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

Параметры в CGI-скрипт передаются с помощью переменных окружения.

Для исследования переменных окружения напишем небольшой скрипт

#!/usr/bin/perl print "Content-Type: text/html "; print "<HTML><HEAD><TITLE>Environment</TITLE></HEAD> "; print "<BODY> "; print "Your request is:$ENV{'REQUEST_STRING'}<BR><br> "; print "Variables:<BR> "; print "<I><B>REQUEST_METHOD</B></I>=$ENV{'REQUEST_METHOD'}<BR> "; print "<I><B>QUERY_STRING</B></I>=$ENV{'QUERY_STRING'}<BR> "; print "<I><B>CONTENT_LENGTH</B></I>=$ENV{'CONTENT_LENGTH'}<BR> "; print "<I><B>CONTENT_TYPE</B></I>=$ENV{'CONTENT_TYPE'}<BR> "; print "<I><B>GATEWAY_INTERFACE</B></I>=$ENV{'GATEWAY_INTERFACE'}<BR> "; print "<I><B>REMOTE_ADDR</B></I>=$ENV{'REMOTE_ADDR'}<BR> "; print "<I><B>REMOTE_HOST</B></I>=$ENV{'REMOTE_HOST'}<BR> "; print "<I><B>SCRIPT_NAME</B></I>=$ENV{'SCRIPT_NAME'}<BR> "; print "<I><B>SCRIPT_FILENAME</B></I>=$ENV{'SCRIPT_FILENAME'}<BR> "; print "<I><B>SERVER_NAME</B></I>=$ENV{'SERVER_NAME'}<BR> "; print "<I><B>SERVER_PORT</B></I>=$ENV{'SERVER_PORT'}<BR> "; print "<I><B>SERVER_PROTOCOL</B></I>=$ENV{'SERVER_PROTOCOL'}<BR> "; print "<I><B>SERVER_SOFTWARE</B></I>=$ENV{'SERVER_SOFTWARE'}<BR> "; print "<I><B>HTTP_ACCEPT</B></I>=$ENV{'HTTP_ACCEPT'}<BR> "; print "<I><B>HTTP_USER_AGENT</B></I>=$ENV{'HTTP_USER_AGENT'}<BR> "; print "</BODY></HTML> ";

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

Наверное самым главным в CGI скрипте является обработка полученного запроса и выполнение действий в соответствии с этим запросом. Конечно, если Вы используете простенькие запросы типа http://kudato.tuda/cgi-bin/script.cgi?zapros то особого анализа не требуется, здесь просто нужно считать переменную QUERY_STRING и уже потом в зависимости от содержания строки совершать какието действия.

Но если зпрос будет выглядить так http://kudato.tuda/cgi-bin/script.cgi?par1=1&par2=val&par3=6 или Вы собираетесь обрабатывать данные из форм методом POST, то просто необходимо анализировать данные и преобразовывать их в «удобоваримый» формат.
Предлагаемый автором способ преназначен исключительно для демонстрации работы с переменными окружения. В реальной жизни следует использовать более удобный и надёжный модуль CGI.pm, входящий в стандартную поставку любого дистрибутива Perl, который к тому же обладает многими другими полезными в CGI-программировании функциями. И уж ни в коем случае не следует изобретать велосипед, пытаясь написать свой обработчик запроса, т.к. (раз вы читаете эту статью) написать лучше, чем написан CGI.pm у вас пока вряд-ли получится.

if($ENV{'REQUEST_METHOD'} eq 'GET')# Проверяем, если метод запроса GET {$query=$ENV{'QUERY_STRING'};} # то в $query записываем строку запроса # (ту, что находится после знака "?" в запросе) elsif($ENV{'REQUEST_METHOD'} eq 'POST')# если метод запроса POST {sysread(STDIN,$query,$ENV{'CONTENT_LENGTH'});}# то записываем в $query # данные из заголовка запроса @pairs = split(/&/, $query);# разбиваем запрос на пары ключ=значение foreach $pair (@pairs) {# пробегаемся по всем парам    ($name, $value) = split(/=/, $pair); # ключ в переменной $name, значение # в переменной $value    $value =~ tr/+/ /; # заменяем плюсы на пробелы    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex())/eg; # заменяем нестандартные # символы на кодированные значения типа C00    $value =~ s/<!--(.| )*-->//g; # ликвидируем комментарии    $input{$name} = $value; # организуем хэш }

После включения этого кода в Ваши скрипты Вам остается только использовать хэш $input указывая в фигурных скобках имя параметра. Например значение $input{par1} будет равно «1″,$input{par2} будет равно «val» итд.

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

Доступ к параметрам запроса обеспечивает функция param. Без параметров эта функция возвращает массив значений, содержащих имена ключей параметра. Для получения значения по ключу, в param нужно передать имя ключа в качестве аргумента.

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

#!/usr/bin/perl use CGI qw/:standard/; # подключаем стандартный набор модуля CGI print header;# Выводим заголовок #(вместо print "Content-Type: text/html ";) print start_html('Пример'); # выводим заголовок html-документа foreach $key (param) { # пробегаемся по всем параметрам запроса # помещая ключи значений в переменную $key print "<b>$key</b>: "; # выводим имя ключа $value = param($key); # считываем значение ключа print $value,"<BR>" # и выводим его на экран } print end_html;

Теперь, если вы запустите этот небольшой скрипт (предварительно назвав его params.cgi) таким образом http://some-server.com/cgi-bin/params.cgi?a=1&b=2, то получите следующее

a: 1 b: 2

Получается, что вы передали в скрипт строку запроса a=1&b=2, скрипт ее обработал и выдал выше показанный результат.

Источник:  internet-technologies.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты