Резюме - Язык программирования PERL. Сфера применения

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

    ? Perl представляет собой интерпретируемый язык программирования, который используется программистами для написания скриптов для Web и Internet. ? Конструкции языка Perl во многих отношениях напоминают аналогичные конструкции языка С, однако Perl предлагает много дополнительных возможностей, в особенности для обработки строк и файлов, которые трудно отыскать в языке С. ? Perl является основным языком для написания CGI-программ для Web и Internet, в первую очередь благодаря своей гибкости, компактному стилю и обеспечению высокой безопасности.

Создание скриптов cgi с помощью 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' ";

Как можно видеть, ВАТ-файл просто запускает программу 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 ";

print "Hello, world ";

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

print <<HTML;

Content-type: text/html

<HTML>

<HEAD><TITLE>Test Using HTML</TITLE></HEAD>

<BODY>

<H1><CENTER>

Hello, world

</CENTER></H1>

</BODY></HTML>

HTML

Эти примеры больше походят на исходные коды HTML, чем на программу на языке Perl. Действительно, если вы удалите несколько строк, вы будете иметь HTML-файл. Эта иллюстративная программа использует свойства языка Perl, которые не были рассмотрены в предыдущей главе, но они достаточно просты для понимания. Строка <<HTML и последняя строка с символами HTML представляют собой конструкцию, называемую <здесь-документ> (heredocument), которая перешла сюда из терминологии программированияshell для UNIX. <Здесь документ> представляет собой просто несколько строк литералов. Perl обрабатывает <здесь-документ> как строку в двойных кавычках. Поскольку <здесь-документ> делает исходный код на языке Perl легким для чтения, то использование такой конструкции является идеальным для создания HTML-документов. Используя конструкцию <здесь-документ>, скрипт на языке Perl может не иметь символов цитирования и символов новой строки, и недолжен содержать функций printf. Конструкция <здесь-документ> широко используется в рассматриваемых далее в этой главе примерах.

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

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

print <<HTML;

Content-type: text/html

<HTML>

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

<BODY>

<H3><CENTER>

Environment Variables:<HR>

</CENTER></H3>

for $env (sort keys %ENV)

{

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

}

print "</BODY></HTML> "

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

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

В главе 11 вы видели, что простым способом передачи данных CGI в скрипт является использование строки запросов. Броузер передает данные HTTP-серверу как часть URL. В свою очередь сервер рассматривает все, что следует за знаком вопроса (?) в URL, как строку запроса. CGI-скрипт может получить доступ к строке запросов двумя способами. Либо сервер передает строку запросов скрипту, используя аргументы командной строки, либо сервер присваивает значение строки запросов переменной окружения QUERY_STRING. Например, можно возвратиться к рассмотренному выше скрипту, который выводит на экран значения переменных окружения, и вызвать скрипт, используя строку запросов.

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

Как вы увидели, использование подсказки ISINDEX для создания одиночного запроса достаточно просто. Но для получения от пользователя больше чем одного значения необходимо использовать формы. Следующий скрипт на языке Perl генерирует форму. Используя метод GET, скрипт дает команду броузеру послать значения запроса как часть URL, так же как при использовании ISINDEX. Разница между использованием GET и ISINDEX состоит в том, что при использовании метода GET броузер может соединить несколько величин полей в одну строку запросов, разделяя поля с помощью амперсанда (&;). Для того чтобы скрипт мог определять значения полей, броузер включает имена полей в строку запроса. Например, если база данных содержит три поля (имя, возраст и день рождения) с такими значениями (Bob, 27, 11-1-68), то строка запросов будет содержать значения полей в следующем формате:<name=Bob&;age==27&;birthday=l 1-1-68>. В следующем примере скрипт декодирует поля и выводит на экран их значения с помощью создания HTML-формы:

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

$query = $ENV{QUERY_STRING};

if ($query eq '')

{

# сгенерируем форму

print <<FORM;

Content-type: text/html

<HTML>

<HEAD><TITLE>Sample GET Form </TITLE></HEAD>

<BODY>

What is your query? <P>

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

A checkBox. <BR>

<INPUT TYPE="checkbox" NAME="chek" 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 "Content-type: text/html ";

print "<HTML> ";

print "<HEAD><TITLE>GET Form Result</TITLE></HEAD> "

print "<BODY> ";

print "Your query values:<P> ";

@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<BR> ";

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

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

print "<HTML> ";

}

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 <<FORM;

Content-type: text/html

<HTML>

<HEAD><TITLE>Sample POST Form </TITLE></HEAD>

<BODY>

What is your query? <P>

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

A checkBox. <BR>

<INPUT TYPE="checkbox" NAME="chek" 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 "Content-type: text/html ";

print "<HTML> ";

print "<HEAD><TITLE>POST Form Result</TITLE></HEAD> "

print "<BODY> ";

print "Your query values:<P> ";

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

forech (@field) {

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

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

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

}

}

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

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

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

print "<HTML> ";

}

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:PERLLIB для DOS - и Windows систем) или вы можете ссылаться на нее, используя указание полного пути. Для получения дополнительной информации или для загрузки библиотеки cgi-lib. pl посетите Web-узел http://www. bio. cam. ac. uk/cgi-lib

Похожие статьи




Резюме - Язык программирования PERL. Сфера применения

Предыдущая | Следующая