На главную

Библиотека Интернет Индустрии I2R.ru

Rambler's Top100

Малобюджетные сайты...

Продвижение веб-сайта...

Контент и авторское право...

Забобрить эту страницу! Забобрить! Блог Библиотека Сайтостроительства на toodoo
  Поиск:   
Рассылки для занятых...»
I2R » Сайтостроительство » Web-программирование

Основы web-дизайна. Perl и CGI. Часть II

Примеры CGI-скриптов

1. Выдача информации в браузер

Возьмём простейшую задачку: пусть скрипт что-нибудь посчитает и выдаст в браузер результат.

Замените содержимое файла test.pl на следующий код:

#!C:/Perl/bin/Perl.exe
# Присвоим переменной $a значение 2:
$a = 2;
# Присвоим переменной $b удвоенное значение $a:
$b = $a * 2;
# Отдадим браузеру тип ожидаемых данных:
print "Content-type: text/html\n\n";
# Выведем сами данные:
print qq~
<HTML>
 <HEAD>
   <TITLE>Пример динамически создаваемой страницы</TITLE>
 </HEAD>
 <BODY>
   <H1>Результат:</H1>
   <p class=body>Значение переменной b = $b</p>
 </BODY>
</HTML>
~;

Вся информация, расположенная в блоке

print qq~
   ...
~;

будет передана браузеру as is, т. е. в неизменённом виде. Как видно из приведённого выше примера, организовывать вывод таким образом очень удобно, т. к. переменные (в данном случае $b) можно вставлять прямо в html-код, а в source code выведенной страницы в этом месте будут находиться их значения. Таких блоков в тексте программы может быть сколько угодно, их можно, скажем, сгруппировать в подпрограммы (ключевое слово sub) и снести в конец файла скрипта, чтобы не загромождать текст Perl-программы html-ем.

К слову, этот способ вывода html-кода удобен ещё и по другой причине.

Представьте себе, что вам нужно вывести в браузер строку типа «12375"ghr». Ну, мало ли чем приходится заниматься. ;-) Так вот, если написать это не думая как

print "12375"ghr";

мы получим ошибку, и программа выполняться не будет. Причина в том, что символ «"» будет воспринят как конец строковой константы (string terminator), и всё, что следует за ним, интерпретатор попытается воспринять как код Perl, рузультатом чего явится сообщение об ошибке. В других ситуациях -- например, в случае с регулярными выражениями, синтаксис которых довольно сложен -- в разряд специальных попадут «/», «?», «.», «\», «$», «^» и многие другие символы. Обычно эта проблемы решается использованием символа «\» (backslash):

print "12375\"ghr";

все символы, перед которыми стоит бэкслэш, будут интерпретироваться как обычные и не окажут никакого влияния на выполнение программы.

Пусть вам нужно отдать браузеру десятки строк html-кода. Если делать это построчно, то, во-первых, каждую строку придётся заключайть в контейнер «print "...";», но это не единственная беда: html-код содержит массу символов, которые будут восприняты как специальные и которые придётся предварять знаком «\» (на жаргоне -- «эскейпить»). Блочный же вывод (print qq~ ... ~;) позволяет не менять код и сэкономить таким образом время для чего-нибудь поважнее.

2. Приём данных из формы

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

Способ первый: передача параметров при помощи URL.

До сих пор мы вызывали скрипт, направляя браузер по следующему адресу:

http://localhost/chi-bin/test.pl

Предположим, у нас есть два параметра. Перепишем URL следующим образом:

http://localhost/chi-bin/test.pl?a=2&b=4

Теперь наш скрипт сможет прочитать имена и значения передаваемых ему переменных, как именно -- я опишу чуть позже. Обратите внимание: последовательность передаваемых скрипту данных открывается символом «?», а пары имя/значение отделяются друг от друга амперсендом («&»).

Недостаток способа: все передаваемые параметры в явном виде присутствуют в строке адреса браузера, что в ряде случаев может быть неудобно.

Способ второй: передача данных через html-форму.

Пусть веб-страница содержит форму примерно такого вида:

<form method=POST action="http://localhost/test.pl">
  <input type=hidden name="par1" value="56817">
  <input type=text name="par2" value="rtrtrt">
  <input type=submit value="Отправить данные">
</form>

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

http://localhost/test.pl?par1=56817&par2=rtrtrt

Способ чтения такой формы тот же самый, что и в случае передачи параметров через URL. О нём мы сейчас и поговорим.

Создадим страничку, содержащую ссылку

http://localhost/chi-bin/test.pl?a=2&b=4

Теперь снова перепишем test.pl:

#!C:/Perl/bin/Perl.exe
# Читаем входные параметры:
read(STDIN, $buffer, $ENV);
#Разбиваем параметры на пары:
@pairs = split(/&/, $buffer);
# В цикле обрабатываем каждую пару:
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
   #
   $in = $value;
}
$с = $in * $in;
# Отдадим браузеру тип ожидаемых данных:
print "Content-type: text/html\n\n";
# Выведем сами данные:
print qq~
<HTML>
 <HEAD>
   <TITLE>Пример динамически создаваемой страницы</TITLE>
 </HEAD>
 <BODY>
   <H1>Результат:</H1>
   <p class=body>Значение переменной с = $с</p>
 </BODY>
</HTML>
~;

Я не буду подробно разбирать эту часть кода, т. к., как уже упоминалось, обучение языку Perl выходит за рамки данного курса. Скажу лишь, что результатом работы цикла foreach является ассоциативный массив (associative array), содержащий имена и значения всех входных параметров. Достаточно понять, что каждое из этих значений теперь может быть получено вызовом элемента массива $in, где par_name -- имя нужного нам параметра. Запись $с = $in * $in; очень хорошо это иллюстрирует.

После вызова скрипта в окне браузера должно появиться значение переменной c как произведения значений переменных a и b, которые мы передали скрипту в строке URL. Если что-то не получилось -- добро пожаловать в error.log. О синтаксических ошибках вам скажет сам Perlbuilder.

3. Работа с файлами

Новая задача: скрипт должен прочитать текстовый файл и выдать его содержимое в окно браузера.

Создайте в той же папке, в которой находится файл test.pl, файл text.txt. Скопируйте туда какой-нибудь текст.

#!C:/Perl/bin/Perl.exe
# Задаём имя текстового файла:
$fname = "text.txt";
# Отдаём браузеру тип контента:
print "Content-type: text/html\n\n";
# Печатаем «шапку» HTML-файла:
print qq~
<HTML>
 <HEAD>
   <TITLE>Пример скрипта, читающего локальный файл</TITLE>
 </HEAD>
 <BODY>
   <H1>Содержимое файла:</H1>
~;
  # Открываем файл (или выдаём сообщение об ошибке):
  open(TFILE,$fname) or die "Нет такого файла";
  # Читаем файл построчно в массив:
  @LINES=<TFILE>;
  # Закрываем файл:
  close(TFILE);
  # Получаем количество элементов полученного массива:
  $LTFILE=@TFILE;
  # Запускаем цикл поэлементной обработки массива:
  for ($i=0;$i<$LTFILE;$i++) {
    # Печатаем каждую строку как HTML-параграф:
    print "<p>".$TFILE[$i]."<\/p>";
  }
# Печатаем окончание HTML-файла.
print qq~
 </BODY>
</HTML>
~;

Вот и всё. Заметьте, что слияние строк в Perl'е обозначается точкой (например, две текстовые переменные объединяются записью $a.$b).

Запустите скрипт, набрав его адрес в строке браузера. Если что-то не так -- см. две последние фразы примера №2.

4. Регулярные выражения

Как уже было сказано выше, регулярные выражения предназначены для обработки строк. Распознать regexp (сокращённое название Regular Expression) достаточно просто, обычно их предваряет знак «=~», а сами выражения начинаются с буквы (букв), задающей тип операции: m (match) -- поиск подстроки, s (substitute) -- замена подстроки, и tr (translate) -- трансляция. Регулярные выражения трудночитаемы, поскольку строятся в основном из специальных символов и их последовательностей, но в их основе лежит простая логика, позволяющая творить настоящие чудеса. Вот пара простых примеров:

# Поиск первой кратчайшей подстроки,
# расположенной между подстроками «Van» и «ver».
# результат передаётся служебной переменной $1.
$a =~ m/Van(.*?)ver/i;
# Глобальная замена слова Toronto на слово Vancouver
# по всей строке.
$b =~ s/Toronto/Vancouver/ig;

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

# Одним движением руки убираем все пробелы в начале
# и конце строки. При отсутствии явно заданной
# области поиска операция производится над служебной
# переменной $_:
s/(^s+)|(\s+$)//igm;
# Убираем HTML, случайно попавший в обрабатываемую строку:
s/<.*?>(.*?)<.*?>/$1/igm;

Нравится? Сомневаюсь. Но ещё обязательно понравится. Кстати. все тексты в библиотеке обрабатывались при помощи регулярных выражений, а значит, какая-то польза от них всё-таки есть... ;-)

top

Андрей Пискунов
Источник: Artefact

Спонсор раздела

Рассылки Subscribe.ru:

Библиотека сайтостроительства - новости, статьи, обзоры
Дискуссионный лист для web-разработчиков
Подписка на MailList.Ru
Автор: NunDesign
Другие разделы
Оптимизация сайтов
Web-студии
» Новое в разделе
Web-дизайн
Web-программирование
Интернет-реклама
Раскрутка сайта
Web-графика
Flash
Adobe Photoshop
Рассылка
Инструменты вебмастера
Контент для сайта
HTML/DHTML
Управление web-проектами
CSS
I2R-Журналы
I2R Business
I2R Web Creation
I2R Computer
рассылки библиотеки +
И2Р Программы
Всё о Windows
Программирование
Софт
Мир Linux
Галерея Попова
Каталог I2R
Партнеры
Amicus Studio
NunDesign
Горящие путевки, идеи путешествийMegaTIS.Ru

2000-2008 г.   
Все авторские права соблюдены.
Rambler's Top100