faqs.org.ru

 Главная > Программирование > Web-программирование >

FAQ по Perl и программированию для Web

Секция 1 из 2 - Предыдущая - Следующая

FAQ по perl и программированию для web

Павел Аммосов, apv@i-connect.ru

27 сентября 1999


Русскоязычный сборник частозадаваемых вопросов по языку программирования perl и server-side web programming.

1. Где взять перл и все с ним связанное

2. Где взять документацию по перлу

3. Как сделать на перле то-то (основные возможности языка)

4. CGI-скрипты

5. Web серверы

6. Ускоряемся

7. Использование других языков для написания CGI-программ

8. БД на плоских файлах

9. Реляционные, пост-реляционные и объектно-реляционные СУБД

10. Где взять perl для m$ windows?

11. Борьба с глюками m$ windows


1. Где взять перл и все с ним связанное

1.1 Где можно взять перл?

На CPAN == Comprehensive Perl Archive Network. Homepage CPAN -- http://www.cpan.org/ -- там берут все, связанное с перлом. Собственно исходники новейшей версии перла берут из файла http://www.perl.com/CPAN/src/latest.tar.gz (на самом деле с www.perl.com стоит редирект на ближайший, по мнению www.perl.com, mirror).

1.2 Где можно скачать перловскую библиотеку для работы с WWW?

Там же, где и все, относящееся к перлу -- на CPAN. Полный список всех модулей и библиотек -- http://www.cpan.org/CPAN.html

1.3 C www.cpan.org слишком долго качается, нет ли где поближе?

Есть. Полный список зеркал находится в ftp://ftp.nluug.nl/pub/languages/perl/CPAN/MIRRORED.BY, там можно найти funet или что там поближе, или даже российские зеркала, например ftp://ftp.sai.msu.su/pub/lang/perl/CPAN/ (иногда в дауне).

1.4 Я скачал модуль Lib::Module. Как его установить?

Обычно модуль приходит в формате tar+gzip, типа module-0.01.tar.gz. Вам необходимо его развернуть: tar zxf module-0.01.tar.gz и перейти в образовавшуюся директорию, например module-0.01: cd module-0.01 Обычно там находятся несколько файлов. Для вас будут важными следующие:

README

что это за модуль

INSTALL

как его поставить

Makefile.PL

перловый скрипт для генерации Makefile

Обычно инсталляция происходит следующим образом:

perl Makefile.PL

генерация Makefile

make all

сборка модуля

make test

тестирование модуля

make install

инсталляция модуля

Необходимо внимательно смотреть, не возникли ли какие ошибки во время первых трех команд. Внимание: вы должны иметь административные привилегии для инсталлирование модуля в системе (обычно как root).

Но, если вы их не имеете, то можете инсталлировать модуль у себя. Для этого вам необходимо выбрать, где это будет делаться. Для примера, в $HOME/lib/perl5. Необходимо создать эти директории, если их нет:


 mkdir ~/lib
 mkdir ~/lib/perl5
Затем, при генерации Makefile для модуля, вы должны указать, где вы хотите инсталлировать модуль:perl Makefile prefix=$HOME Все остальные шаги без изменений. В результате вы получите альтернативное место, где у вас будут находиться модули. Например, у меня это выглядит так:
  artur@disco:~ (681) ls -alFg ~/lib/perl5/
  total 704
  drwxr-sr-x   8 artur    staff        512 Oct 06 15:53 ./
  drwxr-sr-x   9 artur    staff       1024 Oct 08 10:50 ../
  drwxr-sr-x   4 artur    staff        512 Mar 31 1998  aix/
  drwxr-sr-x   2 artur    staff        512 Aug 06 13:40 CPAN/
  -r--r--r--   1 artur    staff     126951 Jul 24 19:37 CPAN.pm
  drwxr-sr-x   3 artur    staff        512 Mar 31 1998  man/
  drwxr-sr-x  31 artur    staff       1024 Sep 09 15:41 site_perl/

Для того, чтобы их использовать, есть несколько путей:

  1. указывать при запуске perl в командной строке:
    perl -I$HOME/lib/perl5 -I$HOME/lib/perl5/site_perl script.pl
    
  2. завести переменную шелла PERL5LIB: для sh (bash,zsh,ksh)
    PERL5LIB=$HOME/lib/perl5:$HOME/lib/perl5/site_perl
    
    export PERL5LIB для csh (tcsh)
    setenv PERL5LIB $HOME/lib/perl5:$HOME/lib/perl5/site_perl
    
  3. указывать в начале скриптов дополнительные библиотеки:
    use lib "/home/you/lib/perl5";
    use lib "/home/you/lib/perl5/site_perl";
    
    Данный случай подходит к CGI-скриптам, которые не наследуют ваших переменных окружения.

1.5 Как автоматизировать процесс установки библиотек и модулей?

Скачивание и установка вручную -- достаточно сложное занятие, требующее постоянного вмешательства с вашей стороны. Можно простым способом: сделать su (желательно), запустить perl -MCPAN -e shell. Если это первый запуск модуля CPAN, вам зададут серию вопросов на тему URL вашего любимого зеркала CPAN. После этого все просто: если вы знаете название модуля или библиотеки, то набираете, скажем, install Net::NNTP. Тогда этот модуль (для работы с NNTP) сам ищется на CPAN, сам скачивается, компилируется, устанавливается. Все, поставили, можно выходить и использовать вновь установленный модуль. Если название точно не известно, то набираем там же help и используем различные команды поиска типа i NNTP.

1.6 У меня нет root-привилегий. Можно ли использовать модуль CPAN для установки модулей в этом случае?

При использовании CPAN-модуля вам необходимо сконфигурировать его таким образом, чтобы он сам инсталлировал модули туда, куда вы укажете. Для этого вам необходимо подредактировать файл ~/.cpan/CPAN/MyConfig.pm: указать в строке &makepl_arg& =& q[prefix=/home/you], и теперь всегда при автоматической инсталляции модули будут ставится к вам в $HOME/lib/perl5 Более подробно обо всем этом можно прочитать в документации к ExtUtils::MakeMaker.

NB: Современный Модуль СPAN все сам спросит и сделает.


2. Где взять документацию по перлу

2.1 Какие есть книжки про Перл?

Две классические книги по перлу, первая имеется в русском переводе и продается в магазинах:

Рандал Шварц, Том Кристиансен. Изучаем перл (aka Llama book)

Лэрри Уолл, Том Кристиансен, Рандал Шварц. Programming Perl (aka Camel book, на русском, кажется, еще нет)

Llama book - учебник для начинающих, Camel book - справочное руководство.

**New: Есть еще русский перевод Perl Cookbook под названием Т. Кристиансен, Н. Торкингтон "Perl: Библиотека программиста" - СПб, Издательство "Питер", 2000. ISBN 5-8046-094-X

И еще книжка: М. Райт и др. "CGI/Perl". Ее я не рекомендую, как и все от Райта.

2.2 Где взять стандартную документацию про такое-то свойство перла?

Перл приходит с полным набором документации и набором программ для перевода в разные форматы. Обычно для подробного ознакомления с некоторой особенностью перла пишут "perldoc perlсвойство" или "man perlсвойство". Базовый набор "свойств" таков:

2.3 Я под виндами, man у меня нет, где брать стандартную документацию?

Перл для win32 поставляется с программой perldoc (пользоваться: "perldoc perlfunc" и т. д.) а также с документацией в HTML: если хочешь perldoc perlfunc, ищи perlfunc.html.

2.4 Где взять описание модуля Lib::Module?

Формат стандартной документации по перлу (pod) обладает возможностью встраивания прямо в тексты программ, а программа perldoc -- возможностью извлечения этой документации. Поэтому, чтобы получить документацию по модулю Math::Trig, просто запустите perldoc Math::Trig -- perldoc найдет этот модуль и покажет документацию из него. Если модуль не является частью какой-то библиотеки, а существует сам по себе, например, CGI.pm тогда просто perldoc CGI.pm или даже perldoc CGI. NB: программа perldoc не очень расторопна, поэтому при установке перла под UNIX производится создание manpages для всех модулей, так что man CGI или man Math::Trig покажет быстрее, чем perldoc.

2.5 Есть ли подробный большой FAQ по перлу?

Да, он тоже входит в набор стандартной документации. Отправная точка -- perldoc perlfaq, это оглавление, из которого можно узнать, что FAQ состоит из девяти больших частей.

2.6 Я крутой разработчик, где лежит описание того, как сделать perldoc/manpage к своей библиотеке?

Про это говорят в perldoc perlpod, в man pod2man.

2.7 А есть ли где в интернете хорошие доки по перлу?

Да. На мой взгляд, серия статей Рандала Шварца для Unix Review Perl Columns -- лучшее введение в перл, и намного интереснее и полезнее книг Llama и Camel (мнения авторов не всегда совпадают с мнением координатора -- Аммосов). Почитать их можно на http://w3.stonehenge.com:80/merlyn/UnixReview/.

Почему я считаю это лучшим введением в перл? Потому что это отдельные небольшие статьи, каждая из которых иллюстрирует конкретные возможности перла на примере написания программы для достаточно простой задачи. Все же статьи охватывают практически весь спектр возможностей перла -- от написания скрипта в одну строку, который может поменять Иванов на Сидоров во всех файлах в дереве директорий, до основ объектно-ориентированного программирования и принципов создания собственных модулей и библиотек.

2.8 А где можно найти русскую доку по перлу?

Если нет возможности купить в магазине, то есть кое-что и в Интернете: книга Маслова "Введение в перл", например. http://citforum.ru/koi/internet/perl_tut/ Есть и другие, особо хороших не видел.


3. Как сделать на перле то-то (основные возможности языка)

3.1 Как пользоваться функцией pack (getpwuid, dmbopen)?

man perlfunc или "perldoc -f имя_функции | pod2text"

3.2 Как узнать размер файла (дату создания, атрибуты, разрешения на доступ)?

С помощью так называемых файловых тестов, которые имеют вид (-тест "имя файла"), например:

(-s "file.txt")

размер файла

-e

существует ли файл

-w

доступен ли на запись

-M

количество дней со дня модификации

-t

является ли терминалом

(Как обычно, это неполный список. См. man perlfunc)

3.3 Как отправить почту из скрипта на Perl?

Способ для Unix oт Alex Efros


        open MAIL, '|/path/to/your/sendmail -t'; # Pipe к sendmail
        print MAIL "From: mailrobot@my.host\n",
                   "To: webmaster@my.host\n",
                   "Subject: Wow! I got some mail for you!!!\n\n",
                    $message;
        close MAIL;

У меня не Unix! Что делать?

Вероятно, Вам поможет модуль Net::SMTP

3.4 Как отправить почту с вложениями (attachments)?

Возьмите на CPAN модуль MIME::Tools и прочтите от него README. (MIME-tools.xxxxx.tar.gz)

3.5 Как определить правильность адреса электронной почты Internet?

Гарантированно -- никак. Вы можете проверить адрес на правильность синтаксиса при помощи Email::Valid. И все. Если нужен гарантированно правильный e-mail для web-сайта, вы можете воспользоваться методом от Алексея Тутубалина: требовать пароль для доступа к информации, а сам пароль высылать по электронной почте. Тогда человек должен будет указать свой e-mail, конечно же, если ему интересна эта информация с вашего сайта.

3.6 Как написать модуль?

Простейший случай:

Сам модуль представляет из себя файл с именем MyModule.pm следующего содержания:

MyModule.pm
package MyModule;
require Exporter;

@ISA = qw(Exporter);

@EXPORT = qw(идентификаторы для экспорта: подпрограммы, имена переменных и
пр.);
# Теперь после того, как вы напишите use MyModule в своей программе, у вас все
# упомянутые здесь идентификаторы станут видны. Этот метод не рекомендуется,
# так как вы "засоряете" именное пространство программы.

# И/или
@EXPORT_OK = qw(идентификаторы для экспорта: подпрограммы, имена переменных и
пр.);
# Идентификаторы, прописанные здесь будут видны в Вашей программе как
# MyModule::Идентификатор (подпрограммы) или $MyModule::Идентификатор
# (переменные)
# Или, Вы можете написать use MyModule qw(Ид1 Ид2 $Ид3); и все будет как в
# первом случае. Это рекомендуемый вариант.

... ваши подпрограммы и пр ....

1; # Обязательно

Программа, его использующая:

myprg.pl
use MyModule qw(...);
# Ну и далее

Подробности смотрите в perlmod(1), Exporter(3pm), Camel Book

3.7 Как получить доступ к n-му символу строки?

Надо использовать функцию substr. Например, получить 15й символ из строки $string:

$char = substr($string, 15, 1);

Установить 15й символ строки $string:

substr($string, 15) = 'A';
Можно даже использовать более чем односимвольные последовательности:
$ss = substr($string, 15, 5);
substr($string, 15) = 'Хо-Хо';

4. CGI-скрипты

4.1 Что такое CGI и как с ним работать

CGI -- Common Gateway Interface. Стандарт интерфейса внешних программ с http-сервером.

Как работать

HTTP -- клиент-серверный протокол, следовательно со стороны CGI-программы, как серверного процесса, все взаимодействие выглядит следующим образом

  1. Получение данных от клиента
  2. Обработка данных
  3. Выдача ответа клиенту.

Пункты 1 и 3 я вкратце опишу здесь, а 2, надеюсь, сделаете сами :-). Начнем с п.3, как наиболее простого.

3. Выдача данных клиенту

Обычно клиенту выдают текст в формате HTML (ничто не мешает Вам отправить ему и картинку/видео/etc). Для того, чтобы сервер и клиент вас поняли, необходимо сказать, что вы выдаете, c помощью заголовка Content-Type: mime-type/mime-subtype. Обратите внимание на регистр и последовательность -- если вы скажите нечто типа Content_type, то сервер вас скорее всего не поймет. (Сообщение типа "500 Internal Server Error" будет симптомом).

Пример:

print "Content-Type: text/html\n";

# Мы выдаем текст в формате HTML. Также можно: text/plain -- простой текст, в
# браузере отобразится аналогично тексту, заключённому между тегами
# <pre></pre>.  image/gif -- Картинка, формат gif video/mpeg --
# mpeg-видео И целая куча других форматов, см.  файл mime.types из apache

print "\n";
# <-- еще одна пустая строка, обозначает конец вывода наших
# заголовков. ВАЖНО!

# Теперь мы можем написать свой текст клиенту
print qq{
<html>
<head>
<title>Моя первая CGI программа</title>
</head>
<body>
<h1>Моя первая CGI программа</h1>
</body>
</head>
};

Прием данных от клиента

Взаимодействие с клиентом обеспечивается так: Он заполняет форму своими значениями, нажимает на кнопку "submit", броузер кодирует данные соответствующим образом и отправляет их серверу.

Определение форм

Производится тегами <form> и </form>. Тег определения форм имеет следующие атрибуты

action

скрипт на сервере, который будет запущен на сервере для обработки данных формы.

method

тип взаимодействия с сервером. Может иметь значения GET и POST. Плюс, еще некоторые специальные, которые вы можете посмотреть в rfc

(Аттрибуты перечислены не все, как обычно)

Формы не могут быть вложенными.

Элементы ввода

Определяются тегами <input>, <textarea> и <select> тег <input>:

<input type=checkbox>

Элемент ввода "Опция"

<input type=hidden>

Элемент ввода, который не виден пользователю

<input type=file>

в Netscape Navigator позволяет загрузить файл на сервер

<input type=image>

Изображение. Если по нему щелкнуть, это вызовет submit формы и серверу будут выданы две переменные вида name.x и name.y, где name -- то, что вы пропишете в name=... тега <input>

<input type=password>

Элемент ввода Пароль. Позволяет ввести строку, которая на экране отображается звездочками. Никаких методов защиты при передаче на сервер не применяется

<input type=radio>

Радиокнопки

<input type=reset>

Кнопка сброса значений формы на начальные

<input type=submit>

Кнопка отправки формы на сервер

<input type=text>

строка ввода

Все теги <input> имеют атрибут name -- Наименование элемента. Служит для идентификации при передаче на сервер, а также другие типа value, width, etc, название и назначение которых можно опять-таки посмотреть в учебнике.

Тег <textarea> -- Поле многострочного ввода.

Тег <select> -- списочный выбор

Пример:

  <form action=/cgi-bin/myscript.pl method=GET>
  Имя: <input type=string name=name><p>
  Пол: <input type=radio name=gender value=male>Мужской
       <input type=radio name=gender value=female>Женский
  <input type=submit><input type=reset>
  </form>

Как это будет видно в моей программе?

Это определяется методом формы, GET или POST

В случае GET сервер установит переменную окружения QUERY_STRING в виде name1=vaue1&name2=value2&..&nameN=valueN.

В случае POST аналогичная строка будет записана на стандартный ввод. Ее длину можно получить через переменную окружения CONTENT_LENGTH.

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

Декодирование на perl

  tr/+/ /;
  s/%([0-9a-fA-F]{2})/pack("c",hex($1))/ge;
(списано из CGI.pm)

На самом деле, можно не возится со всем этим, а использовать модуль CGI.pm (Имеется в поставке Perl 5.004 и более поздних. Если у вас perl версии 4 или 1, нужно срочно взять на CPAN новую версию perl)

Самый большой и последний пример

Предположим мы делаем поисковую систему, тогда у нас должен быть HTML с формой и программа, которая будет выполнять поиск.

search.html
<html>
<head>
<title>Поиск</title>
</head>
<<body>
<h1>Чего искать?</h1>
<form action=/cgi-bin/search.pl method=get>
Строка для поиска: <input type=text name=string width=70><p>
Искать в <input type=checkbox name=searchin value=internet>Интернет
  <input type=checkbox name=searchin value=intranet>Интранет
  <input type=checkbox name=searchin value=extranet>Экстранет<p>
<input type=submit value=Давай!><input type=reset value="Нет, не надо">
</form>
</body>
</html>

Программа:

#!/usr/bin/perl -- поменяйте, как надо
use CGI qw(:standard);

print "Content-Type: text/html\n\n"; # Не забудьте про два "\n"

$string = param("string");
@searchin = param("searchin"); # searchin это checkbox и его значения
             # возвращаются списком

# Искать мы сегодня ничего не будем
print "<html>
<body>
<h1>Мы сегодня ничего не ищем</h1>
Но, если бы искали, то: <br>
Искали бы строку <b>$string</b><br>\n";
print "В <b>" . join(" ", @searchin) . "</b>\n";
print "
</body>
</html>
";

Да, кстати, если вы собираетесь писать в файлы с помощью CGI-программ, не забывайте про file locking (См. часть C за подробностями).

4.2 Как заставить браузеры не кешировать выдаваемый результат?

Выдавайте заголовки в таком виде:

print "Content-Type: type/sub-type\n"; # Подставьте Ваш тип/подтип
print "Pragma: no-cache\n"; # Для HTTP/1.0 клиентов
print "Cache-Control: no-cache\n"; # Для HTTP/1.1
print "Expires: Thu Jan  1 00:00:00 1970\n\n"; # Это уже любой броузер должен
                                               # понять

4.3 Как перенаправить клиента на другой URL?

В заголовке напишите:


print "Status: 302\n";
# Или 301. Разница состоит в том, что по стандарту 301 значит "перемещён
# навсегда", а 302 -- "перемещён временно"
print "Location: ВАШ Новый URL\n";
# URL должен быть указан абсолютный
print "URI: ВАШ новый URL\n\n"; # Для http/1.0
Подробности: см. rfc1945(http/1.0), rfc2068(http/1.1)

4.4 Как загрузить файл на сервер?

В поставку CGI.pm входит пример file_upload.cgi. За подробностями смотрите CGI(3).

Учтите, что если у вас система, которая разделяет бинарные и текстовые файлы -- вам понадобится использовать binmode.

Также, помните, что "Русский Apache" не будет производить перекодировку multipart форм.

4.5 Как получить файл по URL?

Возьмите на CPAN библиотеку libwww-perl и смотрите lwpcook(3), там написаны основы использования библиотеки и есть примеры.

4.6 Как использовать плюшки (cookies)?

Плюшки работают следующим образом: программа CGI добавляет в свой ответ директиву Set-Cookie, а клиент (если он поддерживает плюшки), при следующих запросах возвращает их в заголовке Cookie. Сами плюшки представляют из себя пары имя=значение.

Синтаксис Set-Cookie

Set-Cookie: имя=значение; expires=дата; path=путь; domain=домен; secure

Сервер может установить не более 20 плюшек, размер всей плюшки не может превышать 4Kb.

Имя=значение

единственный обязательный параметр. И имя, и значение могут быть строками текста, не содержащими символов перевода строки, пробелов, ; и табуляции. Если необходимо их использовать, можно эти символы закодировать при помощи стандартного uri-кодирования.

expires=дата

устанавливается дата истечения срока действия плюшки. После этой дата плюшка клиентом не возвращается. Если дата не установлена, то плюшка действует до завершения работы браузера.

path=путь

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

domain=домен

домен, для которого возвращается эта плюшка. Может быть доменом уровня 2 и выше, т.е. .example.ru, а не .ru. Если не установлен, то плюшка возвращается только серверу, который выдал плюшку.

secure

указывает, что плюшка должна возвращаться только по защищенному соединению (SSL).

Синтаксис ответа клиента

Cookie: имя1=значение1; имя2=значение2;....;имяn=значениеn
Программы CGI могут получить пары имя-значение через переменную окружения HTTP_COOKIE. В модуле CGI.pm значение можно получить при помощи метода cookie().

В деталях, механизм плюшек описан в rfc2109 (HTTP State Management Mechanism. D. Kristol, L. Montulli. February 1997.)

Пример: 1. Установка плюшки

setcookie.pl
#!/usr/bin/perl

print "Content-Type: text/html\n";
print "Set-Cookie: mycookie=some+string\n\n";
print "<html><head><title>Установка плюшки</title></head>\n";
print "<body><h1>Установка плюшки</h1>\n";
print "<a href=getcookie.pl>Щелкни здесь,</a> чтобы посмотреть, что
получилось.
print "</body></html>";

2. Получение плюшки

getcookie.pl;
#!/usr/bin/perl
use CGI qw(:standard);

print "Content-Type: text/html\n\n";
print "<html><head><title>Получение плюшки</title></head>\n";
print "<body><h1>Плюшка</h1>\n";
print "mycookie = ", getcookie('mycookie');
print "</body></html>";

Секция 1 из 2 - Предыдущая - Следующая

Вернуться в раздел "Web-программирование" - Обсудить эту статью на Форуме
Главная - Поиск по сайту - О проекте - Форум - Обратная связь

© faqs.org.ru