Практический Перл для начинающего
Практический
Перл для начинающего
Данная работа
написана для людей, которым в силу непреодолимых обстоятельств приспичило
срочно изучить Перл. Для меня таким обстоятельством стало то, что мой компьютер
стал WEB-сервером, а я, соответственно, WEB-мастером. Учиться принято на чужих
ошибках и опыте, поэтому предлагаю Вашему вниманию свой опыт изучения Перла.
Сразу нужно
пояснить, для кого это все написано. Если Ваш сервер работает на платформе
UNIX, то это я должен читать Вашу статью. У меня же установлен Windows NT
workstation 4.0 (RUS) плюс
Service Pack 3. Когда пришло
время сделать из компьютера WEB-сервер, я было кинулся ко встроенным Службам
узла WEB, но быстро понял, что это мне не нравится (почему ?). И тут один
добрый человек посоветовал поставить Xitami WEB Server от iMatix Corporation
(http://www.imatix.com/), который и стоит по сей день.
Что касается
самого Перла, то здесь несколько сложнее. Покопавшись по различным Перловым серверам
(www.perl.org , www.perl.com ) я узнал, что версий Перла настолько много, что
выбрать что-нибудь конкретное довольно сложно. При этом каких-нибудь
вразумительных рекомендаций по поводу выбора той или иной версии нигде нет.
Перепробовав почти все версии для Windows, я остановил свой выбор на Active
Perl (http://www.activestate.com/).
Человеку,
избалованному всякими Виндовозами и Дельфями, писать программы на Перл довольно
непривычно, поэтому настоятельно рекомендую сразу установить Perl Builder.
Взять его можно на www.solutionsoft.com. Там лежала тридцатидневная Демо
версия.
Ну, думаю, пора
переходить непосредственно к делу. В общем случае, скрипт на Перл, как и любая
другая программа, работает так:
получает данные
обрабатывает
данные
выдает
результаты
Передать данные
скрипту можно двумя методами - GET и POST. Разница между ними в том, что при
использовании GET данные постоянно болтаются в строке адреса браузера, напимер:
httр://treagraf.tasur.edu.ru/cgi-bin/price.pl?Category=POWER&Description=varta
В этом случае
скрипт B_price.pl
берет данные в переменной окружения QUERY-STRING.
$data=$ENV{'QUERY_STRING'};
При
использовании метода POST данные передаются на стандартный вход скрипта. Длинна
блока данных берется в переменной CONTENT_LENGTH:
read(STDIN,$data,$ENV{'CONTENT_LENGTH'});
Теперь эти
данные нужно перевести в удобоваримый вид, поскольку они закодированы.
Стандартным
соглашением служит замена пробелов знаками плюс и затем кодировка оставшихся
недопустимых символов с помощью ASCII-кодов в шестнадцатиричной форме, перед
которыми ставится знак (%). Пример:
http://treagraf.tasur.edu.ru/cgi-bin/B_price.pl?Category=%C2%E8%E4%E5%EE&Description=%E0%E1%E2%E3
Это значит:
http://treagraf.tasur.edu.ru/cgi-bin/B_price.pl?Category=Видео&Description=абвг
Декодировать
строку запросов в первый раз лучше самому. На вопрос "а как?" есть
множество ответов, переписывать которые нет смысла. Приведу лишь короткий
пример:
Заменяем знаки
(+) на пробелы
$query = ~ s/+/ /g;
Потом заменяем
все сочетания знака (%), после которого следуют шестнадцатиричные цифры, на
соответствующий символ ASCII
$query =~ s/%([0-9A-H]{2})/pack('C', hex($1))/eg;
Я пользуюсь
тем, что предлагает Perl Builder:
#! E:perl5binperl
&GetFormInput; # вызов подпрограммы получения данных
$Category = $field{'Category'}; # получаем данные из поля Category
$Description = $field{'Description'}; # получаем данные из поля Description
$Page = $field{'Page'}; # получаем данные из поля Page
В конце скрипта
помещаем подпрограмму "прозрачного" чтения данных.
sub GetFormInput {
(*fval) = @_ if @_ ;
local ($buf);
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN,$buf,$ENV{'CONTENT_LENGTH'});
}
else {
$buf=$ENV{'QUERY_STRING'};
}
if ($buf eq "") {
return 0 ;
}
else {
@fval=split(/&/,$buf);
foreach $i (0 .. $#fval){
($name,$val)=split (/=/,$fval[$i],2);
$val=~tr/+/ /;
$val=~ s/%(..)/pack("c",hex($1))/ge;
$name=~tr/+/ /;
$name=~ s/%(..)/pack("c",hex($1))/ge;
if (!defined($field{$name})) {
$field{$name}=$val;
}
else {
$field{$name} .= ",$val";
#if you want multi-selects to goto into an array
change to:
#$field{$name} .= " $val";
}
}
}
return 1;
}
Второй этап
работы скрипта - обработка данных - полностью на Ваше усмотрение. Проверяйте
полученные данные на правильность, пишите их в файл, делайте что хотите.
И, наконец, Вам
нужно выдать какие-то результаты броузеру клиента, причем так, чтобы броузер
правильно их отобразил. То есть, выдавать результаты нужно в HTML. Это делается
просто: (тоже можно по-разному)
print 'Content-type: text/html', "/n/n"; #обязательная строка
print '
В поле Category Вы ввели: ', $Category, '
',"n"
Все это
касается скриптов, получающих данные из формы на странице HTML. При этом
страница с формой - отдельно, скрипт - отдельно. Можно сделать красивее и
удобнее: объединить страницу и скрипт в единое целое. Для этого скрипт пишется
по схеме:
При первом
запуске скрипт рисует HTML страницу с формой и ссылкой в тэге ACTION на самого
себя. Первый запуск определяется по отсутствию входных данных.
Если входные
данные есть, то получаем их, обрабатываем и выдаем результаты.
Пример:
#!
E:perl5binperl
if (($ENV{'QUERY_STRING'} eq '') or
($ENV{CONTENT_LENGTH}=0) )
{ # генерируем
страницу с формой }
else
{# получаем
данные, обрабатываем и выдаем результат}
Гостевая книга
Общий алгоритм
работы гостевой книги таков:
1. Если
посетитель хочет сделать запись в книгу, то
1.1 Получаем
данные
1.2 Записываем
их в файл или в базу данных
1.3 Говорим
спасибо на HTML и предлагаем почитать другие записи
2. Если
посетитель хочет почитать записи в книге, то
2.1 Читаем
записи из файла или из базы данных
2.2 Выводим их
красиво в HTML
Для удобства
восприятия я оформил пункты 1 и 2 отдельными скриптами add_guestbook.pl
и read_guestbook.pl
соответственно. Сообщения гостевой книги хранятся в текстовом файле построчно,
т.е. на каждую запись - строка. Так сделано для удобства чтения этого файла.
Пример одной записи:
Sat Dec 5
13:31:20 1998&Наташа&студентка&Good&Для начала хорошо. Успехов
на данном поприще Вам, Александр!&нету@пока&194.226.60.34
Вот описание
полей рассматриваемой гостевой книги.
Name - имя,
фамилия, отчество, кличка - на усмотрение посетителя
Work -
профессия, род занятий
RadioButton -
три кнопки: понравилось (Good), не понравилось (Bad), пофигу (Different)
Text - text box
комментариев и примечаний
Email -
обратный адрес
add_guestbook.pl
- запись в книгу
#!
e:perl5perl
# Первая
строка, как обычно
require "ssi-pl.pl";
# Я использую
навигационную панель в виде SSI-включения. Для этого используется модуль
ssi-pl.pl
if (($ENV{'QUERY_STRING'} eq '') or
($ENV{CONTENT_LENGTH}=0) )
{
# Если нет
входных данных, то генерируем страницу с формой
print