Free-Time.Ruна главную free-time
 
www.free-teme.ru www.free-teme.ru
Комиксы Комиксы
Комиксы детям Комиксы детям
Знаменитости Знаменитости
Автотехнтка Автотехнтка
Вооружение Вооружение
Чат Чат
Гороскопы Гороскопы
Открытки Открытки
Юмор Юмор
Кроссворды Кроссворды
Погода в мире Погода в мире
Новости Новости
Реклама Реклама

Баннер 120x60
Самое-самое Самое-самое
Азартные игры Азартные игры
Библиотека прогаммиста Библиотека прогаммиста
Все о здоровье
Драгоценности Драгоценности
Интимная жизнь Интимная жизнь
Искусство Искусство
Косметология Косметология
Кулинария Кулинария
Лирика Лирика
Лица века Лица века
Сад и огород Сад и огород
Сказки Сказки
Солюшены Солюшены
Страны и флаги Страны и флаги
ЭЭС ЭЭС
Яхты Яхты
 
 
 

анонс

CGI на Perl


Вызов CGI-скрипта

На UNIX-системах программисты могут исполнять скрипты, написанные на языке Perl, как выполняемые файлы. Иными словами, для нах нет необходимости делать что-то специальное для вызова скрипта. На системах, основанных на DOS или Windows, некоторые серверы не исполняют скрипты Perl автоматически. В этом случае вам придется писать пакетный файл, который вызывается команды Perl для запуска скрипта. Для некоторых систем придется подробнее познакомиться с документацией по ващему HTTP-серверу относительно запуска скриптов Perl. Большинство серверов HTTP предполагает, что CGI находится в каталоге под названием cgi-bin. В этом случае можно вызвать скрипт с помощью URL, подобно следующему:

http://your-domain/cgi-bin/your-script

Вызов CGI-скрипта в системе UNIX

Если вы поместили ваш скрипт в каталог cgi-bin и сделали его выполнимым, то пользователь может вызвать скрипт, непосредственно используя URL. Однако необходимо выполнить несколько шагов. В первую очередь, в начало скрипта необходимо поместить строку, которая идентифицирует файл как программу на языке Perl:

chmod +x your-script

Вызов скрипта на языке Perl из DOS и Windows

В DOS или Windows скрипты Perl сами по себе не являются выполнимыми самостоятельными программами. Вместо этого необходимо запустить исполнимую программу PERL.EXE, вкдючая имя скрипта на языке Perl в командной строке. Для упрощения этого процесса можно создать BAT-файл для каждого вашего скрипта, который запускает PERL.EXE с соответствующим файлом, содержащим скрипт. Например, предположим, что ваш BAT-файл HELLO.BAT содержит следующие команды:

@echo off perl Hello.PL %1 %2 %3 %4 %5 %6 %7 %8 %9

Также предположим, что скрипт Perl Hello.PL содержит следующие инструкции:

print "Hello, args are '@ARGV'\n";

Как можно видеть, BAT-файл просто запускает программу PERL.EXE с указанием скрипта Hello.PL в качестве входной командной строки.

Если вы запустите скрипт на языке Perl на Web-сервере, то обнаружите, что большинство HTTP-серверов распознает скрипты на языке Perl ( например, как это делает Folk-Web-сервер ), так что нет необходимости в использовании BAT-файла. Иными словами, если вы используете HTTP-OLN?LN IADDADAEE FolkWeb, вам нет надобности делать что-то специальное для вызова CGI-OENEDOA на языке Perl. В противном случае может потребоваться создать BAT-файл.

Если ваша программа-сервер нуждается в BAT-файле для выполнения скрипта на языке Perl, вы должны поместить BAT-файл ( такой как Hello.BAT ) в каталог cgi-bin и туда же - скрипт Perl ( Hello.PL )

Создание текста и HTML-документа с использованием языка Perl

Создание текстовых документов с использованием языка Perl представляет собой тривиальную задачу. Вам только необходимо удостовериться, что вы поместили правильный HTML-заголовок в начале текстового документа. Например, следующий скрипт создает простой текстовый документ, содержащий сообщение Наше вам с кисточкой :-) :

print "Content-type: text/plain\n\n"; print "Наше вам с кисточкой :-)\n";

Создание текстовых документов HTML также очень просто. Например, в следующем фрагменте текста создается простой документ HTML:

print <<HTML;

Contenc-type: text/html

 

<HTML>

<HEAD><TITLE>Test using HTML</TITLE></HEAD>

<BODY>

<H1><CENTER>

Наше вам с кисточкой :-)

</CENTER></H1>

</BODY></HTML>

HTML

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

Строка <<HTML и последняя строка с символами HTML представляет собой конструкцию, называемую "здесь-документ" ( here document ), которая перешла сюда из терминологии программирования shell для UNIX. "Здесь-документ" представляет собой просто несколько строк литералов. Perl обрабатывает "здесь-документ" как строку в двойных ковычках.

Поскольку "здесь-документ" делает исходный код на языке Perl легким для чтения, то использование такой конструкции является идеальным для создания HTML-документов. Используя конструкцию "здесь-документ", скрипт может не иметь символов цитирования и символов новой строки, и не должен содержать функций print. Конструкция "здесь-документ" широко используется в рассматриваемых далее примерах.

Добавление в документ динамических свойств

Если бы возможность CGI-скриптов ограничивались созданием статических форм, то это было бы грустно. Настоящая сила CGI состоит в придании Web-страницам динамики. Следующий пример выводит на экран значения переменных окружения:

print <<HTML;

Content-type: text/html

 

<HTML>

<HEAD><TITLE>Echo Environment Variables</TITLE></HEAD>

<BODY>

<H3><CENTER>

Environment Variables: <HR>

</CENTER></H3>

HTML

for $env (sort keys %ENV) {

print "<LI>$env is $ENV{$env}<BR>";

}

print "</BODY></HTML>\n";

Этот пример создает статический заголовок и затем выводит значения переменных окружения скрипта, используя форматированный HTML-документ. Скрипт показывает, как использовать конструкцию "здесь-документ" совместно с традиционной функцией print.

Доступ к строке запросов

Самым простым способом передачи данных CGI в скрипт является использование строки запросов. Броузер передает данные HTTP-серверу как часть URL. В совю очередь сервер рассматривает все, что следует за знаком вопроса ( ? ) в URL, как строку запроса.

CGI-скрипт модет получить доступ к строке запросов двумя способами. Либо сервер передает строку запросов скрипту, используя аргументы командной строки, либо сервер присваивает значение строки запросов переменной окружения QUERY_STRING. Например, можно возвратиться к рассмотреномувыше скрипту, который выводит на экран значения переменных окружения, и вызвать скрипт, используя строку запросов.

Эхо строки запросов

Следующий скрипт направляет пользователю эхо строки запросов. Скрипт также обеспечивает подсказку ISINDEX, которая упрощает пользователюввод строки запросов. Броузер пользователя обрабатывает подсказку из ISINDEX и добавляет вход к URL:

print <<HTML;

Content-type: text/html

 

<TITLE>

Echo Ouery String from ISINDEX

</TITLE>

Below is the standart ISINDEX query promt.

The query will be passed in the QUERY_STRING

environment variable. <P>

 

Notice that funny characters (!#%^& etc) are

encoded in the query string <P>

 

<ISINDEX>

HTML

print "Your decoded query string is: <BR>\n";

$query = $ENV{QUERY_STRING};

print "$query<P>\n";

 

print "Your decoded query string is: <BR>\n";

$query =~ s/\+/ /g;

$query =~ s/%([0-9A-H]{2})/pack('C',hex($1))/eg;

print "$query<P>\n";

Когда скрипт или броузер добавляет строку запросов к концу URL строка запросов не должна включать в себя символы, недопустимые для URL. Стандартным соглашением служит замена пробелов знаками "+" и затем кодировка оставшихся недопустимых символов с помощью ASCII-кодов в восьмеричной форме, перед которыми ставиться знак (% ). Броузер кодирует все данные, используя эти правила.

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

Для декодирования строки запросов скрипт использует два регулярных выражения. Первое регулярное выражение заменяет ( + ) пробелами:

$query =~ s/\+/ /g;

Как можно видеть, регулярное выражение использует формат поиска и замены: s/PATTERN/REPLACEMENT/. В этом случае выражениемодифицирует переменную $query, замещая всякое появление в ней плюса знаком пробела. Символ g в конце регулярного выражения указывает на необходимость выполнить глобальную подстановку и замену, замещая все знаки плюс в строке.

Второе регулярное выражение заменяет все срчетания знака %, после которого следуют все восьмеричные цмфры, на соответствующий символ ASCII:

$query =~ s/%([0-9A-H]{2})/pack('C',hex($1))/eq;

В данном случае выражение, которое вставляется в качестве замены, является выраженим языка Perl. На это указывает символ e, который добавлен к регулярному выражению. Выражение pack('C',hex($1)) возвращает ASCII-символ, соответствующий двум восьмеричным цифрам. Переменная $1 ссылается на часть строки, которая подходит под шаблон [0-9A-H]{2}, отвечающим двум восьмеричным цифрам. Если имеется более одной пары скобок, то значение доступны скрипту через специальные переменные $2, $3 и т.д.

Декодирование форм HTML с использованием метода GET

Как вы увидели, использование подсказки ISINDEX для создания одиночного запроса достаточно просто. Но для получения от пользователя больше чем одного значения необходимо использовать формы. Следующий скрипт на языке Perl генерирует форму. Используя метод GET, скрипт дает команду броузеру послать значение запроса как часть URL, так же как при использовании ISINDEX. Разница между использованием GET и ISINDEX состоит в том, что при использовании метода GET броузер может соединить несколько величин полей в одну строку запросов, разделяя поля с помощью амперсанда ( & ).

Для того, чтобы скрипт мог определять значения полей, броузер сключает имена полей в строку запроса. Например, если база данных содержит три поля ( имя, возраст и день рождения ) с такими значениями ( Роман, 17, 02-15-81 ), то строка запросов будет сожержать значения полей в следующем формате: "name=Roman&age=17&bithday=02-15-81". В следующем примере скрипт декодирует поля и выводит на экран их значения с помощью создания HTML-формы:

($cgi_bin, $cgi_script) = ($0 =~ m:(.*)[/\\](.*):);

$query = $ENV{QUERY_STRING};

if ($query eq '') {

# generate a form

print <<FORM;

Content-type: text/html

 

<HTML>

<HEAD><TITLE>Simple GET Form</TITLE><?HEAD>

<BODY>

What is your query ? <P>

<FORM METHOD="GET" ACTION="$cgi_script">

A checkbox. <BR>

<INPUT TYPE="checkbox" NAME="check" VALUE="on"><P>

A radio button set. <BR>

<INPUT TYPE="radio" NAME="button" VALUE="1">1<BR>

<INPUT TYPE="radio" NAME="button" VALUE="2">2<BR>

<INPUT TYPE="radio" NAME="button" VALUE="3">3<P>

A data entry field. <BR>

<INPUT NAME="field"><P>

Send the data. <BR>

<INPUT TYPE="submit">

</FORM>

</HTML>

FORM

}

else {

# print the query results

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

print "<HTML>\n";

print "<HEAD><TITLE>GET Form Results</TITLE></HEAD>\n";

print "<BODY>\n";

print "Your query values: <P>\n";

@fields = split('&', $query);

foreach (@fields) {

$switch: {

/^check=(.*)/ && do {

$check = $1;

last Switch;

};

/^button=(.*)/ && do {

$button = $1;>

last Switch;>

};

/^field=(.*)/ && do {

$field = $decode($1);

last Switch;

};

}

}

print "Check Box: $check<BR>\n";

print "Radio Button: $button<BR>";

print "Data Field: ", $html($field), "<BR>\n";

print "</HTML>\n";

}

sub decode {

local($value) = @_;

$value =~ s/\+/ /g;

$value =~ s/%([0-9A-H]{2})/pack('C',hex($1))/eq;

return $value;

}

sub html {

local ($value) = @_;

$value =~ s/</&lt;/g;

$value =~ s/>/&gt;/g;

return $value;

}

Обратите внимание на первую строку скрипта:

(cgi_bin, $cgi_script) = ($0 =~ m:(.*)[/\\](.*):);

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

Скрипт определяет, создавать ли форму или обработать запрос, в зависимости от того, поступил ли запрос от пользователя. Для обработки строки запросов скрипт разделяет запрос на поля, используя функцию split. Далее скрипт сравнивает поля запроса с ожидаемыми именами полей.

Рассмотрим следующий пример:

foreach(@fields) {

Switch: {

/^check=(.*)/ && do {>

$check = $1;

last Switch;

}

Обычная форма цикла foreach включает переменную ( $VAR ). Если цикл foreach опускает эту переменную, то Perl использует переменную по умолчанию $_. Аналогично, оператор регулярного выражения обычно выглядит следующим образом $VAR=~/PATTERN/. Если переменная в выражении опущена, Perl использует $_ как переменную по умолчанию, в результате чего цикл и регулярное выражение соответствуют друг другу. Однако еслислишком полагаться на переменные по умолчанию, то код на языке Perl может получиться неясным. В данном же случае использование переменных, определенных по умолчанию, делает код более коротким и лучше читаемым.

Далее обратите внимание на регулярное выражение, имеющее форму /^field=(.*)/. Данное выражение указывает на необходимость начать поиск от начала строки, что предотвращает совпадения в середине имени другого поля. Иными словами, имя поля и знак равенства ( = ) должны соответствовать сами себе. Остающаяся часть регулярного выражения соответствует значению поля и извлекает его в переменную $1. Посколько $1 представляет собой временную переменную, то скрипт копирует ее в переменную с именем для каждого поля.

Скрипт использует подпрограмму decode для декодирования символов из полей, которые были закодированы броузером. Регулярные выражения, используемые подпрограммой декодирования, рассматривались в предыдущем примере.

Наконец, скрипт использует подпрограмму html, чтобы закодировать значения данных для вывода их в текст HTML. Скрипт может послать большую часть текста броузеру в виде HTML-документа без выполнения какой-либо обработки. Однако поскольку HTML использует угловые скобки ( <> ) для кодирования HTML-входов, скрипт должен закодировать эти скобки, используя последовательности HTML &lt; и &gt;.

Декодирование форм HTML с помощью метода POST

Следующий скрипт очень напоминает только что обсуждавшийся, за исключением того, что данный скрипт использует метод POST для посылки данных формы скрипту CGI. Метод POST дает директиву броузеру послать данные формы, используя стандартный вход скрипта, а не строку запросов. Полезность метода POST заключается в том, что он может обрабатывать большие объемы данных, тогда как метод GET ограничен пространством переменной сервера, а также длиной URL броузера.

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

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

($cgi_bin, $cgi_script) = ($0 =~ m:(.*)[/\\](.*):);

$content_length = $ENV{CONTENT_LENGTH};

if ($content_length > 0) {

sysread(STDIN, $query, $content_length);

}

if (!defined($query) || $query eq '') {

# generate a form

print <<FORM;

 

Content-type: text/html

 

<HTML>

<HEAD><TITLE>Simple POST Form</TITLE></HEAD>

<BODY>

What is your query ? <P>

<FORM METHOD="POST" ACTION="$cgi_script">

A checkbox. <BR>

<INPUT TYPE="checkbox" NAME="check" VALUE="on"><BR>

A radio button set. <BR>

<INPUT TYPE="radio" NAME="button" VALUE="1">1<BR>

<INPUT TYPE="radio" NAME="button" VALUE="2">2<BR>

<INPUT TYPE="radio" NAME="button" VALUE="3">3<P>

A data entry field. <BR>

<INPUT TYPE="submit">

</FORM></HTML>

FORM

}

else {

# print the query results>

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

print "<HTML>\n";

print "<HEAD><TITLE>POST Form Results</TITLE></HEAD>";

print "<BODY>\n";

print "Your query values: <P>\n";

@fields = split('&', $query);

foreach(@fields) {

/([^=]+)=(.*)/ && do {

local ($field, $value) = ($1, $2);

$query{$field} = $decode($value);

}

}

print "Check Box: $query{check}<BR>\n";

print "Radio Button: $query{button}<BR>\n";

print "Data Field: ", &html($query{field}), "<BR>\n";

print "</HTML>\n";

}

sub decode {

local ($value) = @_;

$value =~ s/\+/ /g;

$value =~ s/%([0-9A-H]{2})/pack('C',hex($1))/eq;

return $value;

}

sub html {

local ($value) = @_;

$value =~ s/</&lt;/g;

$value =~ s/>/&gt;/g;

return $value;

}

Этот скрипт использует одно регулярное выражение для анализа всех значений полей в строке запроса:

/([^=]+)=(.*)/ && do {

local ($field, $value) = ($1, $2);

$query{$field} = &decode($value);

}

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

Обратите внимание на сочетание [^=] в регулярном выражении. В данном контексте знак ( ^ ) не является якорем, указывающим на начало строки, как это было в предыдущем примере. В данном случае этот знак служит отрицанием для знака [ = ]. В таком качестве регулярное выражение может быть прочитано так: "соответствует одному или более символам, не включая знак равентсва, затемсоответствует знаку равенства и затем соответствует всем остающимся символам".

Использование библиотеки CGI-LIB языка Perl для декодирования форм

Общедоступная библиотека Perl cgi-lib.pl упрощает обработку CGI-форм. Она сожержит несколько полезных подпрограмм, однако наибольший интерес представляет подпрограмма ReadParse, которая читает и анализирует данные формы. Одним из больших достоинств cgi-lib является то, что она прозрачно обрабатывает любой тип форм ( ISINDEX, GET, POST ) и даже формы, состоящие из многих частей для ввода больших объемов данных.

Некоторые подпрограммы, такие как PrintHeader, HtmlTop, HtmlBot, создают стандартные HTML-последовательности, но они слишком просты и не так полезны, как хотелось бы. Для использования cgi-lib вы включаете исходные коды с помощью директивы require. Вы можете инсталировать cgi-lib.pl туда же, где установлена стандартная библиотека Perl ( обычно C:\PERL\LIB для DOS- и Windows-систем ) или вы можете ссылаться на нее, используя указание полного пути.

Для получения дополнительной информации или для загрузки библиотеки cgi-lib.pl посетите http://www.bio.cam.ac.uk/cgi-lib


[Назад | Главная | Содержание раздела | Напишите нам]

Создание сайтовРазработка сайтов
Новое на сайте Новое на сайте
Восстановлена работа
чата
добро пожаловать!
Добавлен
материал в подраздел
/астрология/гороскопы
Обновлён раздел
"танки"/Стрелковое
оружие/Вооружение
Добавлен материал в раздел "дробовики"/Стрелковое оружие/Вооружение
Обновлён
подраздел
"Автоматы"/Стрелковое
оружие/Вооружение
Добавлен материал в подраздел "карточные фокусы"