СОЗДАНИЕ СКРИПТОВ CGI С ПОМОЩЬЮ PERL. В главе 12 вы познакомились с программированием на языке Perl. В это главе вы научитесь использовать Perl для создания скриптов CGI. Коротко говоря, вы получите возможность сочетать ваши знания по языку Perl и CGI, полученные в предыдущих главах. Кроме того, вы узнаете несколько новых приёмов программирования на языке Perl. Как вы уже знаете, можно создать скрипты CGI, используя практически любой язык программирования. Чтобы быть грамотным Web-программистом, вы должны не только знать, как писать програм- мы для WEB, но также необходимо иметь представление о том, какие средства использовать для решения специфических задач. За счёт правильного выбора языка программирования и программных средств в соответствии с вашей задачей, вы можете значительно повысить эф- фективность работы и сэкономив много сил и времени. Когда вы ис- пользуете язык Perl для создания скриптов, можно создать устойчи- вые профессиональные скрипты за относительно короткий промежуток времени. Остаток этой главы посвящен изучению программирования CGI-скриптов на языке Perl. К моменту окончания изучения этой главы вы поймете следующие концепции: ? Perl представляет собой эффективное средство для создания на- дежных скриптов без написания кодов большого объёма, что выгодно отличает его от других языков программирования, таких как C и С++. ? Версия 5 языка Perl добавляет много новых возможностей, таких как поддержка объектно-ориентированных скриптов и усовершенство- вание техники определения области видимости переменных. Почему разработчики используют Perl для создания CGI- скрип- тов? Предыдущие две главы должны были составить у вас представле- ние о том, что такое CGI и почему мощные возможности языка Perl по обработке текстов делают его хорошо приспособленным для разра- ботки CGI-скриптов. Другие причины и пользования разработчиками языка Perl для написания CGI-скриптов заключаются в том, что Perl обеспечивает широкую поддержку взаимодействия с базами данных, обладает переносимостью и обеспечивает безопасность при работе в сетях. Как уже говорилось, Perl представляет собой один из наибо- лее мощных языке программирования для обработки текстов. Скрипты CGI обычно имеют дело с интенсивной обработкой текста: анализом данных, обеспечением доступа к база данных, генерацией HTML-стра- ниц и т. д. Типичный CGI-скрипт, написанный на языке Perl, по своему размеру представляет собой фрагмент программы аналогичного назна- чения, написанной на C++. Как вы увидите дальше в этой главе, Perl обеспечивает поддержку взаимодействия с базами данных. По существу, Perl имеет встроенный менеджер баз данных Perl был пе- ренесен почти что на все популярные вычислительные платформы та- кие как Windows, UNIX, MS, DOS. To обстоятельство, что Perl яв- ляется 6ecплатным, также увеличивает его привлекательность. Пос- кольку Perl не использует указателей, то он является более безо- пасным и надежным языком, чем С и C++. За счет исключения ис- пользования указателей предовращается нарушение доступа к памяти и связанные с этим ошибки. Кроме того используя регулярные выра- жения языка Perl, легко проверить целостность входных данных и отфильтровать всякие escape-последовательности, которые МОГУТ уг- рожать безопасности вашей системы. Наконец, для повышения безо- пасности имеется специальная версия Perl, называемая taintperl, предотвращающая использование каких-либо входных данных в качес- тве системных команд. Дополнительную и информацию о taintperl можно найти на Web-узлах, указанных в конце этой главы. ВЫЗОВ CGI-СКРИПТА На UNIX-системах программисты могут исполнять скрипты, напи- санные на языке Perl, как выполнимые файлы. Иными словами, для них нет необходимости делать что-то специальное для вызова скрип- та. На системах, основанных на DOS или Windows, некоторые серве- ры не исполняют скрипты Perl автоматически. В этом случае вам придется писать пакетный файл, который вызывает команды Perl для запуска скрипта. Для некоторых систем придется подробнее познако- миться (. документацией по вашему НТTР-серверу относительно за- пуска скриптов Perl. Большинство серверов HTTP предполагает, что скрипты CGI находятся в каталоге под названием cgi-bin. В этом случае можно вызвать скрипт с помощью URL, подобно следующему: http://your-domain/cgi-bin/your-script Примечание: В URL задан каталог cgi-bin, но в действительности скрипт может находиться где угодно в системе. Вы должны опреде- лить его расположение при установке сервера HTTP. ВЫЗОВ СGI-СКРИПТА В СИСТЕМЕ UNIX Если вы поместили ваш скрипт в каталог cgi-bin и сделали его выполнимым, то пользователь может вызвать скрипт, непосредствен- но используя URL. Однако необходимо выполнить несколько шагов. В первую очередь, в начало скрипта необходимо поместить строку, ко- торая идентифицирует файл как программу на языке Perl: #!/usr/bin/perl Примечание: Вы должны будете указать в этой строке путь, завися- щий от того, где установлен Perl на вашей системе. Далее необходимо сделать скрипт выполнимым, используя команду chmod: chmod +x your-srcipt ВЫЗОВ СКРИПТА НА ЯЗЫКЕ PERL ИЗ DOS И WINDOWS В DOS или Windows скрипты Perl сами по себе не являются вы- полнимыми самостоятельными программами. Вместо этого необходимо запустить исполнимую программу PERL.EXE, включая имя скрипта на языке Perl в командной строке. Для упрощения этого процесса мож- но создать ВАТ-файл для каждого вашего скрипта, который запус- кает PERL. ЕХЕ с соответствующим файлом, содержащим скрипт. Нап- ример, предположим, что ваш ВАТ-файл HELLO.ВАТ содержит следую- щие команды: @echo off perl Hello.pl %1 %2 %3 %4 %5 %6 %7 %8 %9 Также предположим, что скрипт Perl Hello.PL содержит следую- щие инструкции: print "Hello, args are '@ARGV'\n"; Как можно видеть, ВАТ-файл просто запускает программу PERL.EXE с указанием скрипта Hello.PL в качестве входной коман- дной строки. Если вы запустите скрипт на языке Perl из Web-серве- ра, то обнаружите, что большинство HTTP-серверов распознают скрипты на языке Perl (например, как это делает FolkWeb- сервер), так что нет необходимости в использовании ВАТ-файла. Иными слова- ми, если вы используете HTTP-сервер наподобие FolkWeb, вам нет надобности делать что-то специальное для вызова CGI-скрипта на языке Perl. В противном случае может потребоваться создать ВАТ-файл. Если ваша программа-сервер нуждается в ВАТ-файле для выпол- нения скрипта на языке Perl, вы должны поместить ВАТ-файл (такой как HELLO.ВАТ) в каталог cgi-bin и туда же - скрипт Perl (Hello.PL). СОЗДАНИЕ ТЕКСТА И HTML-ДОКУМЕНТА С ИСПОЛЬЗОВАНИЕМ ЯЗЫКА PERL Создание текстовых документов с использованием языка Perl представляет собой тривиальную задачу. Вам только необходимо удостовериться, что вы поместили правильный НТМL заголовок в на- чале текстового документа. Например, следующий скрипт создает простой текстовый документ, содержащий сообщение Hello, world: print "Content-type: text/plain\n\n"; print "Hello, world\n"; Создание текстовых документов HTML также очень легко. Напри- мер, в следующем фрагменте текста создается простой документ HTML: print <
\n";
@fields = split('&', $query);
forech (@field) {
Switch: {
/^check=(.*)/ && do {
$check = $1;
last Switch;
};
/^button=(.*)/ && do {
$button = $1;
last Switch;
};
/^field=(.*)/ && do {
$field = $decode(1);
last Switch;
};
}
}
print "Check Box: $check
\n";
print "Radio Button: $button
\n";
print "Data Field:", &html($field), "
\n";
print "\n";
}
sub decode{
local ($value) = @_;
$value =~ s/\+/ /g;
$value =~ s/%([0-9A-H]{2})/pack('C',hex($1))/eg;
return $value;
}
sub html {
local ($value) = @_;
$value =~ s/</g;
$value =~ s/>/>/g;
return $value'
}
Обратите внимание на первую строку скрипта:
($cgi_bin, $cgi_script) = ($0 =~ m:(.*)[/\\](.*):);
Это выражение выглядит похожим на аналогичное выражение в
предыдущем примере. Однако в данном случае скрипт разделяет путь
на каталог и имя файла. В этом примере один и тот же скрипт соз-
дает форму и обрабатывает ее вывод, что достаточно нетрудно вы-
полнить. Такой способ рекомендуется для обработки форм, потому
что концентрирует всю обработку в одном месте.
Скрипт определяет, создавать ли форму или обработать запрос,
в зависимости оттого, поступил ли запрос от пользователя. Для об-
работки строки запросов скрипт разделяет запрос на поля, ис-
пользуя функцию split. Далее скрипт сравнивает поля запроса с
ожидаемыми именами полей. Рассмотрим следующий пример:
forech (@field) {
Switch: {
/^check=(.*)/ && do {
$check = $1;
last Switch;
};
Обычная форма цикла foreach включает переменную {$VAR). Если
цикл foreach опускает эту переменную, то Perl использует перемен-
ную по умолчанию $_. Аналогично, оператор регулярного выражения
обычно выглядит следующим образом $VAR=~/PATTERN/. Если перемен-
ная в выражении опущена, Perl использует $_ как переменную по
умолчанию, в результате чего цикл и регулярное выражение соответ-
ствуют друг другу. Однако если слишком полагаться на переменные
по умолчанию, то код на языке Perl может получиться неясным. В
данном же случае использование переменных, определенных по умол-
чанию, делает код более коротким и лучше читаемым.
Далее обратите внимание на регулярное выражение, имеющее
форму /^field=(. *)/. Данное выражение указывает на необходи-
мость начать поиск от начала строки, что предотвращает совпаде-
ния в середине имени другого поля. Иными словами, имя поля и знак
равенства (=) должны соответствовать сами себе. Остающаяся часть
регулярного выражения соответствует значению поля и извлекает его
в переменную $1. Поскольку $1 представляет собой временную пере-
менную, то скрипт копирует ее в переменную с именем для каждого
поля. Скрипт использует подпрограмму decode для декодирования
символов из полей, которые были закодированы броузером. Регуляр-
ные выражения, используемые подпрограммой декодирования, рассмат-
ривались в предыдущем примере.
Наконец, скрипт использует подпрограмму html, чтобы закоди-
ровать значения данных для вывода их в тексте HTML. Скрипт может
послать большую часть текста броузеру в виде HTML-документа без
выполнения какой-либо обработки. Однако поскольку HTML ис-
пользует угловые скобки (<>) для кодирования НТМL-входов, скрипт
должен закодировать эти скобки, используя последовательности HTML
< и >.
ДЕКОДИРОВАНИЕ HTML-ФОРМ С ПОМОЩЬЮ МЕТОДА POST
Следующий скрипт очень напоминает только что обсуждавшийся,
за исключением того, что данный скрипт использует метод POST для
посылки данных формы скрипу CGI. Метод POST дает директиву броу-
зеру послать данные формы, используя стандартный вход скрипта, а
не строку запросов. Полезность метода POST заключается в том, что
он может обрабатывать большие объемы данных, тогда как метод GET
ограничен пространством переменной сервера, а также длиной URL
броузера.
Для чтения данных со стандартного ввода скрипт может выз-
вать функцию sys-read с нужным числом байт. Размер строки запро-
са в байтах содержится в переменной окружения CONTENT_LENGTH.
После того как скрипт прочел строку запросов, дальнейшая обработ-
ка данных оказывается очень похожей на рассмотренную в предыду-
щем примере. Для того чтобы сделать, этот скрипт более коротким,
обработка строки запросов осуществляется с помощью несколько бо-
лее сложного подхода:
($cgi_bin, $cgi_script) = ($0 =~ m:(.*)[/\\](.*):);
$content_length = $ENV(CONTENT_LENGTH);
if (!definet($query) || $query eq '') {
# сгенерируем форму
print <
\n";
@fields = split('&', $query);
forech (@field) {
/([^=](.*)/ && do {
local ($filed, $value) = ($1, $2);
$query{$field} = &decode($value);
}
}
print "Check Box: $query{check}
\n";
print "Radio Button: $query{button}
\n";
print "Data Field:", &html($query{field}), "
\n";
print "\n";
}
sub decode{
local ($value) = @_;
$value =~ s/\+/ /g;
$value =~ s/%([0-9A-H]{2})/pack('C',hex($1))/eg;
return $value;
}
sub html {
local ($value) = @_;
$value =~ s/</g;
$value =~ s/>/>/g;
return $value'
}
Этот скрипт использует одно регулярное выражение для анали-
за всех значений полей в строке запроса:
/([^=](.*)/ && do {
local ($filed, $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 посетите Web-узел
http://www.bio.cam.ac.uk/cgi-lib
РЕЗЮМЕ
В этой главе вы познакомились с тем, как использовать Perl
для написания достаточно сложных скриптов CGI. Используя ту тех-
нику, с которой вы познакомились можете, услуги программиста про-
фессионального уровня вашим клиентам, которые желали бы, чтобы их
бизнес был представлен на Web. В главе 14 вы познакомитесь с язы-
ком Java. Как вы увидите, язык Java хорошо приспособлен для соз-
дания узлов Web, содержащих анимацию и мультимедиа. Дополни-
тельно глава 14 представляет другой язык для написания скриптов -
JavaScript. Однако перед тем как переходить к главе 14, про-
верьте, понимаете ли вы следующие ключевые концепции:
? Perl представляет собой разносторонний и гибкий язык программи-
рования, с помощью которого можно разрабатывать скрипты CGI для
Web, а также традиционные программы для каждодневного использова-
ния.
? Perl хорошо приспособлен для обработки текстов, организации
доступа к базам данных, он является переносимым языком и обеспе-
чивает безопасность при работе в сетях. Все эти его характеристи-
ки являются важными для Webпрограммирования.
? Для обработки текстов скрипты языка Perl широко используют ре-
гулярные выражения.
? Большинство скриптов на Web в настоящее время написаны на язы-
ке Perl. Однако такие языки, как JavaScript и VBScript, могут по-
сягнуть на монополию языка Perl.
ВАЖНЕЙШИЕ WEB-УЗЛЫ С ИНФОРМАЦИЕЙ ПО СОЗДАНИЮ СGI- СКРИПТОВ С
ИСПОЛЬЗОВАНИЕМ PERL
Следующие Web-узлы помогут вам узнать больше деталей относи-
тельно использования языка Perl для создания CGI-скриптов, а так-
же об объектноориентированном программировании. Используйте эти
узлы в качестве отправной точки вашего исследования Web.
http://www.globalserve.net/~brent/tech/perl/index.html
- Watermarks: исходный код Perl
http://iamwww.unibe.ch/~scg/Src/ - Архив скриптов SCG
http://sunsite.unc.edu/jem/source.html - Исходный код
http://www.metronet.com:70/1/perlinfo/scripts - Скрипты Perl
для многих целей
http://worldwidemart.com/script/ - Маттовский архив скриптов
http://www.bio.cam.ac.uk/cgi-lib/ - Home страница CGI-LIB.PL
scan & edit by eastwood. eastwood@shadrinsk.zaural.ru
http://www.shadrinsk.zaural.ru/~eastwood
) A*.FRM *.MAC < Б