Часть VI.
Сценарии сервера:
интерфейс CGI и язык PERL

"Три главных добродетели программиста — Леность, Нетерпимость и Высокомерие."

Ларри Волл

Глава 6.1. Введение в PERL

6.1.1. Что такое PERL?

Язык программирования PERL (Practical Extraction and Report Language) был разработан Ларри Воллом (Larry Wall) в 1986-87 гг. для сложной обработки текстов в среде Unix и стал первым сценарным языком в современном понимании этого термина. Сегодня PERL поддерживается тысячами разработчиками как проект Open Source и реализован практически для всех существующих операционных систем. При этом он продолжает оставаться абсолютным лидером среди других языков этого класса по количеству написанных на нем сценариев. Последней (на момент написания этой части) стабильной версией языка была версия PERL 5.6.0, на спецификации которой и основано последующее изложение.

PERL — это язык программирования высокого уровня, предназначенный для написания сценариев, работающих как на стороне клиента, так и на стороне сервера. Его основными применениями являются системное администрирование и CGI-программирование для Веб-серверов. С учетом темы нашего справочника мы сосредоточим основное внимание на второй сфере. Что касается операционных сред, то в центре нашего внимания будут Unix и Windows, поскольку они практически полностью охватывают компьютеры, работающие в Сети.

Синтаксис PERLа напоминает синтаксис языка C, но благодаря обилию хорошо продуманных сокращений разработка сценариев на нем происходит намного быстрее. Краткость PERLа часто считают его недостатком, поскольку написать на нем корректную, но абсолютно нечитабельную программу легче, чем на других языках. Однако, PERL позволяет нам выбирать стиль программирования, и ничто не мешает писать на нем программы, внешне схожие с программами на C. С другой стороны, сочетание скорости разработки с мощью получаемых программ делает PERL непревзойденным инструментом реализации сложных сценарных проектов. Наконец, для PERLа существует громадная библиотека готовых модулей CPAN (Comprehensive PERL Archive Network), доступ к которой свободен для всех.

К недостаткам PERLа следует отнести недостаточно развитую поддержку кодировки символов Unicode. Однако, судя по заявлениям разработчиков, этот недостаток будет устранен в ближайшей ревизии языка.

Лозунгом создателей языка является фраза «Это можно сделать несколькими способами». В ней отразилась философия разрабоки PERLа: включить в язык наиболее интересные возможности обработки текстов из различных источников, даже если они в чем-то дублируют друг друга. В результате получился язык с широкими возможностями, причем для эффективного программирования нам не нужно знать их все. Часто какие-то особенности языка оказываются сюрпризом даже для его знатоков. Автор ни в коей мере себя к последним не причисляет и описывает те возможности PERLа, которыми пользуется сам.

6.1.2. PERL в HTML-документах

Включение PERL-сценария в HTML-документ производится обычным образом:

<html>
<body>
<script type="text/perlscript">
$window->document->write("Это я, PERL!");
</script>
</body>
</html>

Для обработки событий используется синтаксис объект_событие, аналогичный VBScript:

<html>
<body>
<input type="button" value="Button1" id="btn1"></input>
<script type="text/perlscript">
sub btn1_onclick {
  $window->alert("Вы меня нажали!");
}
</script>
</body>
</html>

К сожалению, эти примеры будут работать в Windows только в обозревателе Internet Explorer 4.0+ (и, разумеется, после того, как вы установите PERL на свой компьютер). Аналогично PERL используется и в ASP-файлах:

<%@ LANGUAGE = PerlScript %>
<html>
<body>
<% 
$response->write("Привет от PERLа из ASP!");
%>      
</body>
</html>

6.1.3. PERL на Веб-сервере

Как мы уже отмечали, PERL главным образом используется для написания CGI-сценариев, обеспечивающих взаимодействие Веб-страниц с Веб-сервером. Подробно CGI-программирование на PERL будет рассмотрено в гл. 6.13, пока же приведем общие правила. Файл, содержащий PERL-программу, обычно имеет расширение .pl и следующее строение:

#!/usr/bin/perl
print "Это снова я, PERL!\n";

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

6.1.4. Структура PERL-программы

Программа на языке PERL состоит из деклараций и операторов. Формат программы свободный, т. е. мы можем добавлять пробелы и переносы строки между лексическими единицами программы. Единственное ограничение: текст, начиная с символа "#" и до конца строки, считается комментарием и игнорируется.

Декларации в PERLе требуются только для форматов отчетов и подпрограмм (но неопределенная подпрограмма все же может быть загружена и обработана, см. гл. 6.6). Переменные деклараций не требуют; они просто содержат неопределенное значение undef до тех пор, пока им не будет присвоено какое-либо конкретное значение. Декларации могут располагаться в любом месте программы, т. к. обрабатываются на этапе компиляции, предшествующем этапу исполнения программы. Однако, локальные переменные, созданные функцией my(), должны располагаться в том же блоке, что и определение использующей их подпрограммы или формата.

Операторы PERLа подразделяются на простые и составные. Простые операторы — это выражения, при вычислении которых возможны побочные эффекты. Составные операторы состоят из блоков, заключенных в фигурные скобки. Отметим, что, в отличие от языков C или Java, фигурные скобки в составных операторах обязательны, даже если в них заключен только один оператор. Операторы разделяются точкой с запятой.

Поясним введенные понятия на примере:

#!/usr/bin/perl
@names = ("Австрия", "Бельгия", "Венгрия", "Греция");
for ($i=0; $i <= $#names; $i++) {
  print "$names[$i]";
}

Здесь первый оператор присваивает переменной @names массив строк, а второй оператор последовательно выводит эти строки на экран. Обратите внимание на фигурные скобки, в которые заключено тело оператора for. Чтобы показать специфику PERLа, запишем этот оператор намного короче:

#!/usr/bin/perl
@names = ("Австрия", "Бельгия", "Венгрия", "Греция");
foreach (@names) {
  print;
}

Если первый пример интуитивно ясен любому программисту, то второй — только людям, владеющим PERLом (что выводит функция print без аргументов?). Так что почувствуйте разницу: выбор стиля программирования за вами.

6.1.5. Интерпретатор perl

Интерпретатор языка PERL называется, как ни странно, perl (следуя традиции, мы пишем его название строчными буквами в отличие от названия языка, который пишут то PERL, то Perl, но всегда с прописной буквы). Командная строка имеет стандартный синтаксис:

perl опции? программа аргументы?

где опции начинаются с символа "-". Мы можем задать опции вызова perl либо в командной строке, либо в первой строке PERL-программы. Например, для включения опции "вывод предупреждений" можно включить опцию -w в первую строку программы, которая примет вид:

#!/usr/bin/perl -w
print "Это снова я, PERL!\n";

или вызвать perl командой perl -w itsme.pl, где itsme.pl — имя файла с программой. (Мы предполагаем, что путь доступа к интерпретатору включен в переменную окружения PATH.) Краткое описание опций интерпретатора perl приведено в Приложении 20.