На этом шаге мы рассмотрим общую схему обработки данных формы.
Данные формы поступают в CGI-программу в закодированном виде, поэтому в качестве первого шага CGI-сценарий должен выполнить декодирование полученной информации. При пересылке данных методом GET данные формы присваиваются переменной среды QUERY_STRING, при передаче методом POST - передаются в программу через стандартный ввод и тоже могут быть присвоены некоторой внутренней переменной. Таким образом, декодирование данных сводится к следующей последовательности манипуляций со строкой:
Программа декодирования HTML-формы может выглядеть, например, так:
# ! /usr/bin/perl # Декодирование данных формы, переданных методом GET $form_data = $ENV{ ' QUERY_STRING ' } ; # Преобразование цепочек %hh в соответствующие символы $form_data =~ s/% ( . . ) /pack ("С", hex ($l))/eg; # Преобразование плюсов в пробелы $form_data =~ tr/+/ /; # Разбиение на пары имя=значение @pairs = split (/&/, $form_data) ; # Выделение из каждой пары имени и значения поля формы и сохранение # их в ассоциативном массиве $form_fields foreach $pair (@pairs) { ($name, $value) =split (/=/, $pair); $form_fields { $name } =$value ; }
Если данные формы переданы методом POST, то в приведенном тексте следует заменить оператор присваивания
$form_data = $ENV{ ' QUERY_STRING ' } ;
read (STDIN,$ form_data, $ENV{ 'CONTENT_LENGTH'});
В приведенном примере используются две новые функции: pack() и hex(). Поясним их назначение прежде, чем перейти к обсуждению текста программы.
Функция
pack template, list
За каждым символом может следовать число, обозначающее счетчик применений данного символа в качестве формата. Символ * в качестве счетчика означает применение данного формата для оставшейся части списка.
$х = pack "cccc", 80, 101, 114, 108; $х = pack "c4", 80, 101, 114, 108; $х = pack "B32", "01010000011001010111001001101100"; $х = pack "H8", "5065726С"; $х = pack "H*", "5065726C"; $х = pack "cB8H2c",80,"01100101",72,108;
Значение переменной $х во всех случаях равно "Perl".
Функция
hex expr
В тексте приведенной на этом шаге программы все представляется очевидным. Разберем только наиболее насыщенную строку
$form_data =~ s/%(..)/pack ("С", hex ($l))/eg;
Образец для поиска задан в виде регулярного выражения %(..). Этому образцу удовлетворяет произвольная последовательность вида %ху, где х, у - любые символы. В результате кодирования данных в качестве х, у могут появиться только шестнадцатеричные цифры, поэтому можно не задавать более точный, но менее компактный шаблон %([0-9A-Fa-f] [0-9A-Fa-f]). Часть выражения заключена в скобки (..). При нахождении подходящего фрагмента %hh его часть, содержащая шестнадцатеричное число hh, сохраняется в переменной, которая затем будет использована в качестве аргумента функции hex($l) для преобразования в десятичное значение. Функция pack упакует это десятичное значение в двоичную структуру, которая в соответствии с шаблоном "С" будет интерпретироваться как символ. Этот символ заменяет в тексте найденную цепочку %hh.
После выделения и декодирования данных можно приступить к их обработке. Попробуем написать CGI-сценарий, обрабатывающий данные формы из примера шага 150.
Со следующего шага мы начнем рассматривать создание сценария CGI.