Главная страница

___________________________________________

Общие вопросы

___________________________________________

___________________________________________

Литература

___________________________________________

___________________________________________

Разное

___________________________________________

___________________________________________

E-mail

___________________________________________

___________________________________________

perl+Windows

___________________________________________

___________________________________________

Data Bases (базы данных)

___________________________________________

___________________________________________

Functions (функции)

___________________________________________

___________________________________________

UNIX, WWW, Apache - специфика

___________________________________________

___________________________________________

mod_perl

___________________________________________

___________________________________________

Примеры скриптов и функций

___________________________________________

  • Как одновременно поставить куку и сделать редирект?
  • Надо записать в файл строку, а потом прочесть ее оттуда
  • Закачка файлов на сервер и решение глюка с закачкой
  • Существует ли возможность доступа к mySQL серверу из Perl?
  • Какой путь к Перлу на сервере?
  • А другие пути?
  • Могу ли я запустить две резидентные программы для ежедневного обновления страниц?
  • Могу ли я запускать на сервере резидентные Perl программы, которые круглосуточно активно работают с интернет через Socket?
  • Установлен ли DBI для Perl'a?
  • Как запускать CGI,PL-скрипты вне директории CGI-BIN?
  • Можно ли исполнять .cgi скрипты с другими расширениям
  • У меня не работает скрипт, выдает какую-то ошибку 500, как посмотреть error log?
  • Какая библиотека используется для локализации в Perl? Могут ли быть проблемы с кодировкой?
  • Я скачал модуль Lib::Module. Как его установить?
  • Как автоматизировать процесс установки библиотек и модулей?
  • У меня нет root-привилегий. Можно ли использовать модуль CPAN для установки модулей в этом случае?

___________________________________________

Общие вопросы

___________________________________________

Q: Что такое Perl?
A:

Perl - Practical Extraction and Report Language (язык для практического извлечения данных и составления отчетов) - интерпретируемый язык, созданным программистом Лари Уоллом (Larry Wall) для обработки произвольных текстовых файлов, извлечения из них необходимой информациии и выдачи сообщений. С помощью Perl, например, можно создать скрипт, который открывает один или несколько файлов, обрабатывает информацию и записывает результаты. Perl также удобен для написания различных системных программ. Этот язык прост в использовании и эффективен. Cинтаксис выражений Perl-а близок к синтаксису C.
В отличие от большинства утилит ОС UNIX Perl не ставит ограничений на объем обрабатываемых данных и если хватает ресурсов, то весь файл обрабатывается как одна строка. Рекурсия может быть произвольной глубины. Хотя Perl приспособлен для сканирования текстовых файлов, он может обрабатывать так же двоичные данные и создавать .dbm файлы, подобные ассоциативным массивам. Perl позволяет использовать регулярные выражения, создавать объекты, вставлять в программу на С или C++ куски кода на Perl-е, а также позволяет осуществлять доступ к базам данных, в том числе Oracle.
С изобретением World Wide Web, Perl оказался прекрасным средством для взаимодействия с web-серверами через Common Gateway Interface (CGI) - общий интерфейс взаимодействия. Команды Perl могут легко получить данные из формы HTML или другого источника и что-нибудь с ними сделать.

 

Q: Для чего его используют?
A:

Perl предназначен для выполнения задач командных сценариев Unix в тех случаях, когда они слишком трудны, плохо переносимы или сложны для программирования на другом языке, например на Cи.
Самое распространенное использование - в качестве CGI-программ,
выполняемых на интернет-сайтах.

 

Q: Что нужно чтобы запустить Perl

A:

Для запуска Perl вашей системе понадобится несколько компонент:
Скрипт, написанный вами или предложенный вам другим, сохраненный в текстовом файле.
Perl интерпретатор. Любой Perl скрипт в первой строке содержит путь к этой программе.
Web-страница с которой будет запускаться этот скрипт. Она может содержать форму или просто ссылку, если скрипт не требует входных данных.
Web-сервер. Взаимодействие между web-страницей и скриптом производится сервером. Поэтому вы должны иметь доступ к web-серверу с возможностью записи и запуска на нем скриптов.

 

Q: Под какие платформы он существует?
A:

perl 5 - под практически все виды UNIX-систем (Linux, FreeBSD, SunOS,..), DOS (защищенный режим, i386 и выше), Windows 9x/NT, OS/2, VAX VMS, Novell Netware. Amiga..

 

Q: Где взять компилятор?
A:

Пока полноценных компиляторов не существует - скрипты выполняются и
распространяются в виде исходников. Нечто, заявленное, как компилятор,
и подходящее только к Activestate-перлу для w32, лежит на www.activestate.com

 

Q: Где взять последнюю версию Perl-а?
A:

 www.perl.com ; для windows - www.activestate.com


Q: Где можно взять готовые скрипты?
A:

www.cgi-resources.com
www.cgiresources.com
www.script.ru
www.codemanual.com

 

Q: Какие существуют альтернативы Perl?

A:

Существует несколько альтернатив использованию Perl:
С, Visual Basic - более традиционные компьютерные языки для обработки вводимых данных. Должны компилироваться под определенную платформу.
ActiveX - включение программных компонент, выполняющихся в браузере.
JavaScript, VBScript - обеспечивают некоторую интерактивность HTML страниц, которую HTML обеспечить не может.
Cold Fusion - сторонняя программа для связи форм с базами данных.
PHP/FI - еще одна сторонняя программа для связи форм с базами данных.

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

___________________________________________

Литература

___________________________________________

Q: Какие книги по Perl можете рекомендовать?
A:

Llama Book ("Изучаем перл") в русском издании - для начинающих.
А дальше - Perl Cookbook. Переведенена как "Perl. Библиотека программиста". Список конкретных задач и их решений, плюс уроки хорошего стиля программирования.

Также серия статей Рандала Шварца для Unix Review Perl Columns -- лучшее введение в перл.Почитать их можно на http://w3.stonehenge.com/merlyn/UnixReview/default.htm.

Q: Где взять книги в электронном виде ?
A:

Llama Book по-русски:

ftp://molly.wbt.ru/incoming/lama.rar
http://ag.ru/files/llama.exe

Сайт по программированию и перл:

http://simplex.ru/news/

Сборник Perl Bookshelf - лучшие книги по перл издательства
O'Reilly (англ.). Лежит на:

http://lpcs.math.msu.ru/CD_Bookshelf/Perl/

В виде архива ее можно взять как
ftp://twilight.telco.md/pub/books/perlbookshelf.zip
http://ag.ru/files/perlbookshelf.zip
ftp://freebsd.svib.ru/incoming/ora/perlbookshelf.zip

Perl Cookbook в HTML-виде из этого комплекта, но с исправленными опечатками
(список опечаток - на www.oreily.com):

http://meltingpot.fortunecity.com/nj/80/cookbook.rar

Неплохая книжка для начинающих:

http://www.effectiveperl.com/

The Perl Journal:

www.itknowledge.com/tpj/

Заметки по Perl-у:

http://www.perlreference.com/
http://perlfect.com/articles/
http://www.perlmonth.com/
http://www.stonehenge.com/merlyn/WebTechniques/
http://www.stonehenge.com/merlyn/UnixReview/
http://www.stonehenge.com/merlyn/LinuxMag/
http://www.plover.com/~mjd/perl/#tpj
http://home.od.ua/watman/perl/
http://spider.softclub.net/books/web/
http://athena.vvsu.ru/docs/unix/
http://athena.vvsu.ru/docs/tcpip/
http://athena.vvsu.ru/docs/www/
http://webims.virtualave.net/docs/
http://www.citforum.ru/
http://home.od.ua/watman/perl/


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

Вместе с Perl поставляется полный набор документации и набор программ для перевода в разные форматы. Обычно для подробного ознакомления с некоторой особенностью перла пишут "perldoc perlсвойство" или "man perlсвойство". Базовый набор "свойств" таков:
· Основы perldata, perlvar, perlsyn, perlop, perlsub
· Запуск perlrun, perldebug
· Функции perlfunc
· Objects perlref, perlmod, perlobj, perltie
· Data Structures perlref, perllol, perldsc
· Modules perlmod, perlmodlib, perlsub
· Regexps perlre, perlfunc, perlop, perllocale
· Moving to perl5 perltrap, perl
· Linking w/C perlxstut, perlxs, perlcall, perlguts, perlembed
· Various http://www.perl.com/CPAN/doc/FMTEYEWTK/index.html (not a man-page but still useful)
· perl О перле вообще
· perldelta Что нового в последней версии перла
· perlfaq FAQ
· perltoc Подробное оглавление ко всей документации
· perldata Типы данных
· perlsyn Синтаксис языка
· perlop Арифметические, логические, строковые операции и их приоритет
· perlre Регулярные выражения (обработка текста и поиск)
· perlrun Опции командной строки
· perlfunc Встроенные функции
· perlvar Специальные переменные
· perlsub Как писать свои функции (процедуры)
· perlmod Устройство и принцип работы модулей
· perlmodlib Модули: создание собственных библиотек
· perlmodinstall Поиск и установка модулей и библиотек на CPAN
· perlform "Форматы", или шаблоны для выводимых данных
· perllocale Поддержка интернационализации
· perlref Ссылки и указатели на данные
· perldsc Введение в структурные типы данных
· perllol Структуры данных: массивы и списки
· perltoot Введение в объектно-ориентированное программирование
· perlobj Объекты в перле
· perltie Связь объектов с обыкновенными переменными
· perlbot Perl OO tricks and examples
· perlipc Связь между процессами: pipes, sockets, сигналы и др.
· perldebug Отладка программ
· perldiag Сообщения об ошибках
· perlsec Вопросы безопасности
· perltrap Возможные грабли и ловушки
· perlport Как писать портабельные программы
· perlstyle Стиль программирования на перле
· perlpod Формат стандартной документации и документация, встраиваемая в исходные тексты программ
· perlbook О книгах про перл --- (для совсем крутых) ---
· perlembed Способы внедрения перл-программ в программы на C/C++
· perlapio Собственный API, используемый в исходниках перла
· perlxs XS -- программирование перловских библиотек, используемых вместе с библиотеками на C
· perlxstut Учебник по XS
· perlguts Внутренние функции перла для разработчиков
· perlcall Соглашения о вызове перловских функций из C
· perlhist История и полный список всех версий перла


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

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


Q: Где можно взять описание того, как сделать perldoc/manpage к своей библиотеке?
A:

В perldoc perlpod, в man pod2man.


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

На CPAN. Полный список всех модулей и библиотек -- http://www.cpan.org/CPAN.html


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

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

___________________________________________

Разное

___________________________________________


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

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


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

С помощью так называемых файловых тестов, которые имеют вид (-тест "имя файла"), например:
(-s "file.txt")
размер файла
-e
существует ли файл
-w
доступен ли на запись
-M
количество дней со дня модификации
-t
является ли терминалом

Это неполный список.


Q: Как написать модуль?
A:

Простейший случай:
Сам модуль представляет из себя файл с именем 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(...);
# Ну и далее


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

Надо использовать функцию substr. Например, получить 15й символ из строки $string:
$char = substr($string, 15, 1);
Установить 15й символ строки $string:
substr($string, 15) = 'A';
Можно даже использовать более чем односимвольные последовательности:
$ss = substr($string, 15, 5);
substr($string, 15) = 'Хо-Хо';

Q: Какие существуют редакторы для написания программ, с подсветкой?
A:

Мультиплатформенный - vim
Под win32 - FAR с плагином Colorer, perl scripting tool

Q: Как округлить число?
A:

sprintf("%3.2f",$dig)
Здесь 3 - кол-во знаков до запятой, 2 - после запятой.

Q: Как получить текущую дату и время?
A:

Функция time() возвращает время в unix-формате - количество секунд,
прошедших с 1 января 1970 года. Функция localtime() возвращает дату и время.
В контексте массива - значения секунд, минут, и т.п. раздельно, в скалярном
контексте - строку определенного формата. Подробнее см. perldoc -f localtime

Q: Функция time() возвращает время с точностью до секунды. Как работать с меньшими промежутками?
A:

Time::HiRes

Q: Как послать по e-mail письмо с аттачем?
A:

Mime::Lite

Q: Как по дате вычислить день недели?
A:

Date::Calc

Q: Как, зная дату и время, получить количество секунд, прошедших до этого
времени с 1970 года (unix-time format)?
A:

Time::Local

Q: Можно ли сделать GUI-интерфейс в перловой программе, или вывод в GUI-окно ее результатов?
A:

модуль Tk. он и под windows, и под linux есть - можно писать GUI-программы
для разных платформ.

Q: Как устроить загрузку файла с удаленного сервера? Проще говоря, скачать скриптом файл с http или ftp
A:

LWP

Q: Как создавать графические файлы на лету?
A:

модуль GD, или внешние программы: Imagemagick, fly,..

Q: А что это за закорючки такие в скрипте - s/^[^w]{1,3}(d+)/$1/
A:

Это регулярные выражения, одна из мощнейших возможностей perl. Средства
поиска и замены подстрок в строках

Q: Как ими пользоваться?
A:

Есть целая книга - "Mastering regular
expressions". Также следует прочесть perldoc perlre
А начать можно со следующего:

// - поиск
s/// - поиск и замена
tr/// - трансляция
Если мы хотим узнать, нет ли в строке $_ подстроки 'my', мы пишем:
/my/;
Если мы имеем дело не с переменной по умолчанию, а с любой другой, пишем:
$str=~/my/;
Если мы хотим заменить в строке подстроку tree на root, используем поиск и
замену:
$str=~s/tree/root/;

В конце выражения могут стоять опции g, i и т.п. g означает проводить замену
не 1 раз, а по всей подстроке. i означает не учитывать регистр символов.

В подстроке для поиска можно использовать управляющие символы. Есть
несколько видов управляющих символов - мета-символы, обозначающие какой-то
символ из набора букв, цифр, и т.п., мета-символы, управляющие количеством
символов, и т.п. Например, d в подстроке обозначает любую цифру, w -
любую букву, s - пробел, . - любой символ. Стоящая после мета-символа *
означает, что предыдущий символ может повторяться 0 или более раз. + означает
повторение 1 или более раз. То есть, строка вида

$str=~s/sd+s/ 1 /g;

означает "заменить все числа в строке $str, отделенные пробелами с двух
сторон, на цифру 1, отделенную пробелами".

Q: Как не учитывать регистр в русском тексте? С английским регекспы с ключом i работают, а с русским - нет.
A:

На UNIX'оподобных системах с корректной локализацией (FreeBSD, Linux на
glibc 2.1) это делается так:

use locale;
use POSIX qw (locale_h);
setlocale(LC_CTYPE, 'ru_RU.KOI8-R');

(можно еще выставить переменную окружения export LANG=ru_RU.KOI8-R
тогда будет достаточно вызова use locale; в Perl-скрипте)

Под Windows это делается так:

use locale;
use POSIX qw (locale_h);
setlocale(LC_CTYPE, "Russian_Russia.1251"); # или "Russian_Russia.866"

С трансляцией АКА tr/XX/xx/ даже не используя use locale; можно так сделать:

tr/xB3xE0-xFF/xA3xC0-xDF/; # для KOI8-r

или

tr/xA8xC0-xDF/xB8xE0-xFF/; # для Windows-1251

или

tr/xF0x80-x9F/xF1xA0-xAFxE0-xEF/; # для CP-866

Q: Как и когда используются операторы: ?:, ?!, ?= и т.д.?

A:

(?:pattern) - это почти (pattern). В норме круглые скобки выполняют
одновременно две функции - группируют то, что у них внутри, чтобы можно было
использовать повторители (*, ?, +), и сохраняют то, что там получилось, в
переменных $1, $2,.. (?:pattern) выполняет только первую функцию, не
трогая, таким образом, значения переменных $1, $2,... Что несколько ускоряет
работу (пропорционально количеству откатов, проходящих через границу
выбранной группы) и уменьшает количество переменных.

(?=pattern) - загляд вперед. Отличается от просто pattern тем, что после
успешного нахождения соответствия позиция в строке будет не после
соответствующего куска, а перед ним.

(?!pattern) - отрицательный загляд вперед. Отличается от предыдущего тем, что
pattern найтись НЕ должен.

Вторые оба наиболее осмысленны, когда привязаны к чему-нибудь (^, G, просто
предшествующему шаблону). Но в некоторых ситуациях осмысленны и сами по себе.

В perl 5.005 появились различные нововведения, о которых подробнее можно
узнать в документации: ?<=, ?<!, ?{code}, ?>,
?(condition)yes-pattern|no-pattern


___________________________________________

E-mail

___________________________________________

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

Способ для Unix:

open MAIL, '|/path/to/your/sendmail -t'; # Pipe к sendmail
print MAIL "From: mailrobot@my.hostn",
"To: webmaster@my.hostn",
"Subject: Wow! I got some mail for you!!!nn",
$message;
close MAIL;
У меня не Unix! Как тогда?
Вероятно, Вам поможет модуль Net::SMTP


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

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

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

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


Q: Можно ли проверить, жив ли определенный e-mail адрес?
A:

В общем случае - нельзя. Проверка существования и функционирования домена, в котором этот email прописан, в сущности ничего не дает. Остается отталкиваться от конкретных требований. Например, послать e-mail на этот адрес и попросить ответить, зафиксировав ответ.

___________________________________________

perl+Windows

___________________________________________


Q: Как прикрутить perl к Windows, чтобы можно было скрипты выполнять локально?
A:

www.activestate.com, download perl. Устанавливаете, и запускаете:
perl myscript.pl

Q: У меня перл от Activestate, как мне поставить такой-то модуль?
A:

www.activestate.com/packages/zips/
Находите нужный архив, скачиваете, читаете readme.
Если нужного модуля нет - идёте на CPAN, ищете его там, пытаетесь понять, как
его прикрутить. С некоторой вероятностью он чисто перловый, и тогда есть шанс,
что просто положив его в директорию с модулями, вы получите работающий модуль.
Если же у него есть С-часть, ставите MS Visual C.

Q: Как из браузера смотреть на вывод скрипта? Почему-то показывается исходник.
A:

Потому что между браузером и perl должен стоять сервер, который и
запускает скрипт на выполнение, отдавая результат браузеру. Сервер не
обязательно подразумевает под собой отдельный компьютер - вы можете поставить
себе программу, и обращаться к ней через браузер, наблюдая за работой
скриптов. Варианты:
Personal Web Server из поставки Win9x
Sambar, www.sambar.com
Apache-W32, www.apache.org
Устанавливаете сервер, и либо указываете в настройках сервера ассоциацию на
файлы cgi и pl - запуск perl.exe, либо устанавливаете такую ассоциацию на эти
файлы в windows (dbl click в windows explorer AKA проводник).

Q: Как заставить работать связку perl + MySQL под Windows?
A:

Скачать дистрибутив MySQL с сайта (www.mysql.com), и дистрибутив perl с этого же сайта, собранный с необходимыми модулями - DBI и DBD:MySQL.

___________________________________________

Data Bases (базы данных)

___________________________________________


Q: Как работать из perl с базами данных?
A:

DBI. Это унифицированный программный интерфейс, придуманный для того, чтобы с разными базами можно было работать одинаково (за исключением, конечно, специфики самих SQL-запросов). Устанавливаете модуль DBI (Data Base Interface), ищете и устанавливаете DBD::something (Data Base Driver) - драйвер-связку между DBI и нужной вам базой. Oracle, MySQL, PostgreSQL и куча других СУБД поддерживаются DBI+DBD. Читаете perldoc DBI

___________________________________________

Functions (функции)

___________________________________________


Q: Хочу прочитать список файлов в каталоге, но почему-то не работает или глючит. Делаю так: @files=<*>;
A:

Такой способ вызывает внешнюю программу glob (также, как и способ
@files=glob("*")). Это неправильно не только потому, что на запуск внешней
программы уходит время и ресурсы, но и потому, что где-нибудь этой программы
может просто не оказаться. Более правильный способ - это:

opendir DIR,'/tmp';
@files=readdir DIR;
closedir DIR;

или

opendir DIR,'/tmp';
while $file (readdir DIR)
{
}
closedir DIR;

Заметьте, что в $file будут подставляться как имена файлов, так и имена
подкаталогов.
Несколько подсказок. Чтобы прочесть список файлов, в котором не содержалось
бы '.' и '..', можно написать следующее:

opendir DIR,'/tmp';
@files=grep !/^.+$/,readdir DIR;
closedir DIR;

Таким же способом,- с помощью regexp,- можно задавать любые другие маски
файлов.
Если вы хотите прочесть список каталогов, не трогая файлы:

opendir DIR,/tmp';
@dirs=grep {!/^.+$/ and -d "/tmp/$_"} readdir DIR;
closedir DIR;

___________________________________________

UNIX, WWW, Apache - специфика

___________________________________________

UNIX


Q: Как сделать демона?
A:

perldoc perlipc

WWW


Q: Я положил скрипт на сервер, ввожу его путь в браузер, но вместо того, чтобы выполнять скрипт, браузер выводит его исходный текст.
A:

Чтобы сервер запускал скрипт и выдавал результаты его работы, необходимо объяснить серверу, что этот файл - исполняемый. Существующее в unix-системах понятие "атрибуты файла" отличается от атрибутов в DOS/Windows, и в unix исполняемый файл определяется не расширением, а атрибутом.
Если сервер работает на unix-системе, необходимо проставить на файл атрибуты исполняемого файла. Это делает команда "chmod 0755 file", если вы работаете через telnet или ssh, или же продвинутый FTP-клиент типа CuteFTP или FAR ftp plugin. Атрибуты файла, который могут исполнятьвсе желающие (в том числе и сервер), выглядят в буквенном представлении, как -rwxr-xr-x.
Если вы работаете в win32 среде, достаточно определить программу, запускающую файлы с расширением, которое вы даете скриптам - например, cgi.
Для этого нужно в windows explorer'е дважды кликнуть по файлу .cgi, и выбрать perlbinperl.exe в качестве запускающей программы.

Q: При попытке запустить скрипт происходит Internal Server Error! Что это за ошибка?
A:

Это, строго говоря, просто сообщение об одной из ошибок, приведших к
невозможности нормального выполнения скрипта. Чаще всего возникает в следующих случаях:
1) в первой строке отсутствует или неправильно указан путь к perl. обычно это
#!/usr/local/bin/perl или #!/usr/bin/perl
2) Файл со скриптом содержит DOS-овые концы строк 0x0D 0x0A. В юниксе конец строки - только 0x0A. Чтобы исправить это, воспользуйтесь соотв. возможностью редактора FAR (shift-f2, as Unix text), или при закачке скрипта на ftp используйте ASCII-режим вместо бинарного.
3) Скрипт не выводит ничего во время работы, или не выводит заголовок.
Необходимо, чтобы он выводил хотя бы content-type заголовок, например:

print "Content-type: text/htmlnn";
print "All done";

Обратите внимание на двойной перевод строки в конце заголовка.

Если у вас нет доступа к логу ошибок сервера, для отладки скрипта используйте
директиву
use CGI::Carp qw (fatalsToBrowser);
В этом случае при фатальной ошибке, приводящей к завершению скрипта, эта
ошибка будет видна вам в браузере.

Q: Как узнать IP человека, вызвавшего скрипт?
A:

$ENV{'REMOTE_ADDR'}

Q: Как узнать, с какой страницы идет ссылка на скрипт?
A:

$ENV{'HTTP_REFERER'}

Q: Как узнать IP прокси, если через нее запустили скрипт?
A:

$ENV{'HTTP_VIA'}

A1:

Некоторые прокси добавляют в конец заголовка строку типа
", via ProxyName", и в результате вместо переменной HTTP_VIA эту строку можно
наблюдать в конце переменной $ENV{'HTTP_USER_AGENT'}

Q: А можно ли узнать IP юзера, запустившего скрипт через прокси?
A:

$ENV{'HTTP_X_FORWARDED_FOR'}. Но не все прокси обеспечивают IP сидящего за
ними юзера. "Честные" прокси,- у провайдеров, например,- это делают. А
некоторые халявные прокси-сервера, могут и не показывать IP сидящего "за"
ними пользователя.

Q: А какие еще значения есть у этой %ENV ?
A:

for (keys %ENV) { print "$_ = ${ENV{$_}}n" }

A1:

То же самое, но по-другому записанное (более "перловое" решение):
print join("<br>",map("$_ = $ENV{$_}", keys %ENV));
(пальцы... - прим. SLY)

Q: Как запускать скрипт на сервере через определенные промежутки времени, или в определенное время суток, день недели, месяц?..
A:

Это возможно, если есть шелл-доступ на сервер. Читайте man crontab

Q: Как, зная IP, получить имя (DNS), за которым этот IPзакреплен?
A:

Встроенная функция gethostbyaddr()

Q: Что такое method GET, и что такое method POST?
A:

GET - передача параметров скрипту из строки location браузера. Пример:
script.cgi?mode=aa&type=bb&length=12
Минусы этого метода:
1. Все параметры видны в строке. Если в кач-ве параметров передается пароль
- получается дырка в безопасности
2. Длина данных, передаваемых таким методом, ограничена.
3. Нельзя передавать multipart form data, в т.ч. файлы через кнопочку
"Browse"
POST - передача данных скрипту через STDIN. Отсутствуют минусы метода GET.
Обычно метод GET используется, когда скрипт вызывается со страницы через линк
<a href=...></a>, а POST - при нажатии кнопки submit в форме.

Q: Как обрабатывать параметры, переданные скрипту?
A:

Используйте модуль CGI. Прочтите perldoc CGI , а для начала вот простой
пример:

use CGI;
$q=new CGI();

$mode=$q->param('mode');

$q - объект, который имеет несколько методов и полей, относящихся к
параметрам вызова, переменным окружения, cookie, и пр. Смотрите perldoc CGI.

В $mode содержится значение параметра 'mode'.

или проще:

use CGI qw/:standard/;
$mode=param('mode');

если вам не нужно несколько объектов.


Q: Что надо указать в заголовках HTTP-ответа CGI скрипта, выводящего содержимое, которое надо не показать на экране, а сохранить в файле с заданным именем, например 'data.zip' ? А то браузер сохраняет файл с именем скрипта.
A:

Content-Disposition: attachment; filename="filename.ext"


Q: А как бы мне сделать, чтобы вывод моего скрипта обрабатывался SSI?
A:

Честно - никак (см. документацию на Apache). Однако, раз уж у нас есть Perl, нам, видимо, поможет CGI::SSI
(если это CGI) или Apache::SSI (если mod_perl).

Q: А как бы мне ограничить доступ к скрипту или директории только для умных и
местных (способных взломать веб-сервер или знающих пароль)?
A:

В принципе, возможно множество различных решений. Стандартное делается
средствами авторизационного механизма веб-сервера. Читайте документацию Apache
на предмет директив Auth* и require, а также на предмет параметра AuthConfig
директивы AllowOverride, а то будете потом удивляться, почему совершенно
правильный .htaccess не работает. mod_perl позволяет вклиниться в фазы
контроля доступа, аутентификации и авторизации, и написать свои обработчики.
Для аутентификации и авторизации по базам данных существуют модули для
mod_perl AuthenDBI и AuthzDBI (в свежих версиях они объединились в один
модуль, Apache::AuthDBI), а простейший пример файловой авторизации:

<Files "myscipt.cgi">
AuthType Basic
AuthName My.Script.Very.Secure
AuthFile /home/vasia/.htpasswd
require valid-user
</Files>

Файл /home/vasia/.htpasswd может лежать (и это рекомендуется) в месте,
недоступном для укачивания. Если положить его в такое место невозможно, надо
защитить его от укачивания посредством

<Files ".htpasswd">
deny from all
</Files>

или как минимум всё тем же паролем, только уже с require vasia. Его формат -
имя:пароль, пароль зашифрован стандартным юниксовым crypt(), так что если нет
доступа к команде htpasswd (например, нет шелла), то можно сгенерировать его
перловым скриптом.

Ко всему этому рекомендуется помнить, что пароли Basic авторизации передаются
по сети в незащищённом виде (base64-кодирование строки "имя:пароль"), а поля
форм <input type=password> показываются звёздочками только в браузере, по сети
же передаются как есть (вернее, опять же закодированными, но уже как URL).
Поэтому, если вы не пользуетесь защищённым каналом (SSL), работать так с
действительно конфиденциальными данными нельзя.

___________________________________________

mod_perl

___________________________________________

Q: Что такое mod+perl и зачем он нужен?
A:

Модуль к серверу Apache, который предназначен в первую очередь
для ускорения запуска скриптов. Вместо того, чтобы каждый раз при запуске
скрипта запускался perl, компилировал скрипт и выполнял его, этот perl все
время запущен, и висит в памяти. В памяти же находятся и уже откомпилированные
до состояния исполняемого кода скрипты. Кроме этого он позволяет вмешиваться
почти во все стадии работы сервера, от конфигурирования до различных
стадий обработки запроса; он позволяет получать от Апача все данные о нём
самом и о запросе, которые у того есть.

 

Q: Написание скриптов под mod_perl чем нибудь отличается от написания
обычных CGI скриптов?

A:

Вообще говоря, да.

Во-первых, существует куча более других способов писания под mod_perl -
Perl-SSI, Perl*Handlers, логика работы которых сильно отличается от CGI.
Если же мы говорим о тех скриптах, которые выполняются через
Apache::Registry, то есть следующие различия:

1. Нельзя использовать my-переменные уровня файла. То есть использовать
можно, но результат будет ну очень странный. Дело в том, что с точки
зрения перла, mod_perl-овый скрипт это не файл, а тело процедуры.
Поэтому использование в нем my переменных, которые потом пользуются из
вложенных процедур, приводит к возникновению closure и всему, что из
этого следует.

Можно использовать следущую технику:

use CGI;
use DBI;
use strict;
use что-там-еще-надо

&main;

sub main {
my $cgi=new CGI;

....

}

sub some_more_sub {
...
}

При таким образом написанном скрипте lexical scoring будет
вести себя одинаково и в CGI и в mod_perl.

2. Скрипты живут долго. Поэтому мусор за собой надо чистить аккуратно.

3. Тебе доступен объект Apache::Request, который содержит уйму интересной
информации; в частности, из него можно вытащить пароль при basic
authentication.

4. Теоретически, у тебя есть куда больше способов повлиять на поведение
Apache в процессе обработки твоего запроса, чем из CGI.

5. Если ты используешь самописные модули, то при их редактировании придется
апач перестартовывать (apachectl graceful) - поскольку крайне сложно
(и долго) проверять все зависимости, Apache::Registry проверяет
только момент изменения самого исполняемого им скрипта, а модули,
используемые в качестве Perl*Handler, не проверяются вообще. Если в
конфигурации Апача сказано PerlFreshRestart On, то достаточно его об
этом попросить вежливо (SIGUSR1 AKA apachectl graceful или SIGHUP AKA
apachectl restart), но за отработкой этой директивы при наличии сложных
модулей замечены проблемы. Если она Off, то придётся положить и поднять
(apachectl stop; apachectl start). Существует модуль
Apache:StatINC, который следит за изменениями модулей и перегружает их по
мере изменения. Но есть подозрение, что он не надёжнее PerlFresRestart.

При изменении модулей остерегайтесь эффекта частичного срабатывания -
некоторые запросы обрабатываются еще старой версией модуля, а некоторые - уже
новой. Это происходит оттого, что модуль грузится отдельно каждым экземпляром
Apache, скорее всего, только при первом обращении к использующему его
скрипту, а потому часть экземпляров "запомнила" старый, а к остальным
попал уже "новый".


___________________________________________

Примеры скриптов и функций

___________________________________________

Q: Как одновременно поставить куку и сделать редирект?
A:

sub ReLocate
{
my($where,$cookie)=@_;
print "Status: 302 Movedn";
if ($cookie ne '') { print "Set-Cookie: $cookien" }
print "Location: $wherenn";
}

Q: Надо записать в файл строку, а потом прочесть ее оттуда
A:
# записать строку в файл
open FILE,'>file'; # открыть файл на запись
print FILE 'строка'; # записать строку
close FILE; # закрыть файл

# прочитать строку из файла
open FILE,'file'; # открыть файл на чтение
$string=<FILE>; # прочесть одну строку, включая символ "перевод строки"
chomp($string); # обрезать в конце строки "перевод строки", если он есть
close FILE; # закрыть файл

 

Q: Закачка файлов на сервер и решение глюка с закачкой
A:

#!/usr/bin/perl # используйте -T для CGI-скриптов

$SIG{ALRM} = sub { die "$0 timed out" }; # эти 2 строки не работают под
alarm 900; # Windows, но они необязательны

use strict; # спасает от глупых ошибок
use Fcntl; # O_EXCL, O_CREAT и O_WRONLY
use CGI qw (:standard); # читайте "perldoc CGI"
use CGI::Carp qw (fatalsToBrowser); # вывод ошибок к browser-у

$CGI::POST_MAX = 131072; # максимальный ввод = 128 KB

my $foto = param ('foto'); # имя файла и одноврем. handle
my $DIR = '/home/alex/pics'; # не забудьте "chmod 777 pics"
my $JS = " // JavaScript-функция для пред-
// варительной проверки формы
function check (form)
{
if (form.elements['foto'].value.length < 4)// foto должно быть заполнено
{
alert ('A gde zhe foto?'); // показать JavaScript-окошко
form.elements['foto'].select (); // выделить текст в поле foto
form.elements['foto'].focus (); // и прыгнуть туда курсором

return false; // false запретит browser-у
} // отправлять данные к серверу

return true; // все OK - можно отправлять
}";

print header (-type => 'text/html; charset=koi8-r'),
start_html (-title => 'МИСС ИНТЕРНЕТ', # напечатать заголовок и $JS
-script => $JS);

# regex внизу проверяет, есть ли .gif или .jp(e)g в конце и кладет имя
# файла в $1

if ($foto !~ /([w-]+ . (?: gif | jpe?g ))$/ix) #только имя,путь выкидывается
{
print h1 ('Отправьте нам фото!'), #start_form работать не будет
start_multipart_form (-onsubmit => 'return check (this)'),
filefield (-name => 'foto'),
submit (-value => 'Go baby go!'), # напечатать форму с кнопкой
end_form; # напечатать </FORM>
}

# Этот скрипт никому не мешает вводить мусор (например xxxx.gif) в поле foto,
# что приведет к созданию пустых файлов; если это Вас беспокоит, установите
# новую версию CGI.pm и прочтите
# http://stein.cshl.org/WWW/software/CGI/#upload

elsif (not sysopen FILE, "$DIR/$1", O_EXCL | O_CREAT | O_WRONLY, 0444)
{
print h1 ("Не могу создать $DIR/$1: $!"); # ошибка или такой файл уже есть
}

# Портятся файлы при посылке? См. ниже!

else # все в порядке - файл создан
{
binmode FILE; # включить binmode для Windows
print FILE while (<$foto>); # и скопировать данные в файл
close FILE;

print h1 ('Сердечное Вам спасибо!'); # воспитывать как собак Павлова
}

print end_html; # напечатать </BODY></HTML>


Если закачка некоторых файлов происходит с глюками - видимо, файл
перекодируется на лету русским апачем.

Варианты решения:
1.запретите все перекодировки для скрипта, который разбирает FileUpload,
например таким способом:

<Location /path/to/upload.cgi>
CharsetDisable On
</Location>

и делайте перекодировку сами.

2.Используйте директиву CharsetRecodeMultipartForms, которая появилась в PL23,
но при этом вам все равно придется перекодировать вручную текстовые части
запросов. Для этого можно использовать Russian Apache API, доступное в других
модулях или Russian Apache Perl API, доступное из mod_perl.

Q: Существует ли возможность доступа к mySQL серверу из Perl?
A: Да.

Q: Какой путь к Перлу на сервере?
A: #!/usr/bin/perl

Q: А другие пути?
A: Serverpath: /home/your first letter of login/login/public_html/ Cgi-bin path: /home/your first letter of login/login/public_html/cgi-bin/

Q: Могу ли я запустить две резидентные программы для ежедневного обновления страниц?
A: Да.

Q: Могу ли я запускать на сервере резидентные Perl программы, которые круглосуточно активно работают с интернет через Socket?
A: Нет.

Q: Установлен ли DBI для Perl'a?
A: Да, установлен.

Q: Как запускать CGI,PL-скрипты вне директории CGI-BIN?

A: Для того, чтобы запускать CGI скрипты из директории, отличной от стандартной /cgi-bin, создайте в директории файл ".htaccess" и пропишите в нем следущую строку:
Options ExecCGI
При этом файлы должны быть исполяемыми (маска 750 или -rwxr-x---) и иметь расширение .cgi .pl


Q: Можно ли исполнять .cgi скрипты с другими расширениями?
A: Если же Вам необходимо, что бы файлы имели другое расширение, добавьте в файл .htaccess строку вида:
AddType application/x-httpd-cgi .ext

Где .ext - требуемое расширение для файлов, которые сервер должен интерпретировать как CGI объекты.

Q: У меня не работает скрипт, выдает какую-то ошибку 500, как посмотреть error log?
A: Для отладки скриптов используйте SSH. Запустите скрипт из командной строки и скрипт Вам выдаст все то, что пишет в логи.

Q: Какая библиотека используется для локализации в Perl? Могут ли быть проблемы с кодировкой?
A: Никакой библиотеки не используется. Проблем с кодировкой не будет, если писать и скрипт и страницы в одной кодировке win-1251.


Q: Я скачал модуль Lib::Module. Как его установить?
A: Обычно модуль приходит в формате 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 в командной строке:
2. perl -I$HOME/lib/perl5 -I$HOME/lib/perl5/site_perl script.pl
3. завести переменную шелла PERL5LIB: для sh (bash,zsh,ksh)
4. PERL5LIB=$HOME/lib/perl5:$HOME/lib/perl5/site_perl
export PERL5LIB для csh (tcsh)
setenv PERL5LIB $HOME/lib/perl5:$HOME/lib/perl5/site_perl
5. указывать в начале скриптов дополнительные библиотеки:
6. use lib "/home/you/lib/perl5";
7. use lib "/home/you/lib/perl5/site_perl";
Данный случай подходит к CGI-скриптам, которые не наследуют ваших переменных окружения.


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


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





Новости

День России
08.06.2010


NODEX - профессиональные услуги связи