Спонсор: Microsoft
Опубликован: 04.02.2009 | Уровень: специалист | Доступ: платный | ВУЗ: Воронежский государственный университет
Самостоятельная работа 5:

Разработка CGI-приложений на Perl и PHP

< Лекция 5 || Самостоятельная работа 5: 123 || Лекция 6 >
Аннотация: Цель работы - oзнакомление с: основами языков разработки веб-сценариев на языках Perl и PHP; синтаксисом языков Perl и PHP; реализацией обработки данных, полученых от клиентского приложения, на стороне веб-сервера.

Основы разработки сценариев на языке Perl

Программа на языке Perl состоит из деклараций и операторов. Любой текст, начиная с символа " # " и до конца строки, считается комментарием и игнорируется.

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

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

Знакомство с Perl можно начать со сценария сценарий 1:

#!c:/perl/bin/perl
print "Content-type:text/html\n\n";
print "Hello world!";
10.1. Вывод строки приветствия на Perl

Первая строка сценария, оформленная в виде комментария, указывает на физическое размещение интерпретатора языка Perl. Остальные строки фактически формируют ответ веб-сервера:

Во второй строке в выходной поток передается поле Content-type заголовка ответа сервера, и в конце вставляется пустая строка, отделяющая заголовок от тела ответа сервера.

В последней строке помещается содержимое тела ответа сервера.

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


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

#!c:/perl/bin/perl

print "Content-type: text/html\n\n";
print "<HTML><BODY>\n";

$method = $ENV{'REQUEST_METHOD'};

if ($method eq 'POST') 
 {
  $length = $ENV{'CONTENT_LENGTH'};
  read(STDIN, $qstr, $length);
 }
else
 {
  if ($method eq 'GET') { $qstr = $ENV{'QUERY_STRING'}; }
  else  
   {
    print "Method ".$method." is not supported
       </BODY></HTML>";
    #exit(0);
   }
 }

print "<P>Метод = ", $method;
print "<p>Строка параметров: <p>\n";
print $qstr;

# обратная перекодировка 

$qstr =~ tr/+/ /;
$qstr =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

# выделение списка параметров

print "<p>А теперь отдельные поля:<p>";
@pars = split(/&/, $qstr);

# определение размера массива

$n_pars = @pars;

# выделение имени и значения для каждого параметра

for ($i=0; $i<$n_pars; $i++)
{

 # выделение списка из двух переменных $name и $value

 ($name, $value) = split(/=/, $pars[$i]);
 print "Параметр <B>", $name, "</B> равен <I>", 
        $value,  "</I><br>";
}
print "</HTML></BODY>\n";
10.2. Вывод списка параметров, полученных сервером в запросе от клиента

Данный сценарий ориентирован на передачу данных из веб-формы одним из основных методов: GET или POST. Поскольку передача данных в этих методах отличается, то в сценарии сначала определяется метод передачи данных путем обращения к переменной окружения REQUEST_METHOD, значение которой доступно сценарию через одноименный элемент ассоциативного массива (хэша) ENV, содержащего значения всех переменных окружения.

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

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

В случае метода GET данные доступны в переменной окружения QUERY_STRING.

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

Поскольку в рамках протокола HTTP символы, отличные от латинских букв и цифр передаются в виде шестнадцатиричных кодов (пробелы заменяются на ' + '), требуется предварительное обратное преобразование полученных данных с помощью операторов замены s/// и tr// с использованием шаблонов в виде регулярных выражений.

Далее с помощью функции split происходит разделение блока символов на подстроки по заданному разделителю:

Пары, описывающие имя параметра и его значение разделяются с помощью символа ' & '. Результат разделения помещается в скалярный массив @pars.

Внутри пары имя и значение разделяются символом ' = '.

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

< Лекция 5 || Самостоятельная работа 5: 123 || Лекция 6 >
Михаил Олифиренко
Михаил Олифиренко
Александр Табачук
Александр Табачук

Это только у меня не работает кнопочка "Получить код DreamSpark"? Пишет "временно не доступно..." А когда заработает?

Илья Гончаров
Илья Гончаров
Россия, Воронеж, Воронежский государственный университет, 2004
Андрей Галушко
Андрей Галушко
Украина, Конотоп, КИПТ