|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Sly Golovanov 2:5020/794.13 24 Apr 2000 05:01:01 To : All Subject : FAQ 1/2 --------------------------------------------------------------------------------
Perl FAQ created by SLY Golovanov, 2:5020/794.13
Последнее обновление 15 Apr 2000
Обновления выделяются символом ">" в начале
==============================================================================
Общие вопросы
------------------------------------------------------------------------------
Q: Что такое Perl?
A: Practical Extraction and Report Language. Язык программирования, который
задумывался, как удобный язык для работы со строками, и не стесненный, к тому
же, ограничениями, свойственными другим языкам. Фактически, получился удобный
язык, на котором программы быстро пишутся (в общем случае это не значит, что
они работают быстрее, например, программ С++ - но написать код можно точно
быстрее)
Q: Кто его придумал?
A: Larry Wall. А развивается он при помощи тысяч энтузиастов по всему миру.
Q: Для чего его используют?
A: Самое распространенное использование - в качестве CGI-программ,
выполняемых на интернет-сайтах.
Q: Сколько стоит его коммерческая версия?
A: Мечта тех, кто разрабатывает Perl - сделать некоммерческий продукт, который
будет лучше коммерческих. Это им удается, ИМХО. Perl распространяется
свободно, поддержка пользователей осуществляется через ньюс-конференции и
рассылки. Тем не менее, если есть желание, можно заключить контракт на
поддержку за деньги. Подробности - perlfaq2.
Q: Под какие платформы он существует?
A: perl 5 - под практически все виды UNIX-систем (Linux, FreeBSD, SunOS,..),
DOS (защищенный режим, i386 и выше), Windows 9x/NT, OS/2, VAX VMS, Novell
Netware. Amiga..
Q: А компилятор где взять?
A: Пока полноценных компиляторов не существует - скрипты выполняются и
распространяются в виде исходников. Hечто, заявленное, как компилятор,
и подходящее только к Activestate-перлу для w32, лежит на www.activestate.com
Q: Сайт перла какой? Где взять последнюю версию?
A: www.perl.com
Q: Как сделать то-то? Может, уже есть готовая библиотека?
A: http://www.perl.com/CPAN/
http://search.cpan.org
CPAN - огромное, отсортированное собрание всех дополнительных модулей к perl,
не включенных в поставку. Собраны все версии модулей. Рядом с ними лежат
readme. Скачиваете, и устанавливаете. В 90% случаев то, что вы пытаетесь
сделать, уже кто-то сделал и выложил на CPAN.
Как устанавливать модули для perl w32 - см. ниже, в разделе perl+Windows
Q: Где взять скриптов готовых, побольше?
A: www.cgi-resources.com
www.cgiresources.com
www.script.ru
www.codemanual.com
Только не используйте и не разбирайте скрипты из Matt's scripts archive. Он
не умеет правильно их писать, лучше не учиться плохому.
Q: А вот у меня вопрос...
A: Во-первых, вместе с perl поставляется уйма документации. Hачиная с
perlfaq, который HЕОБХОДИМО прочесть (хотя бы просмотреть заголовки).
Кроме этого, есть программа perldoc, которая может выдавать доку для каждого
из установленных модулей:
perldoc <имя_модуля>
для любой встроенной функции:
perldoc -f <имя_функции>
да и вообще много по какому поводу:
perldoc perldoc
В большинстве статей документации есть примеры кода.
Q: Какие существуют редакторы для написания программ, с подсветкой?
A: Мультиплатформенный - vim
Под win32 - FAR с плагином Colorer, perl sctipring tool
------------------------------------------------------------------------------
Книжки
------------------------------------------------------------------------------
Q: Какую книгу для начинающих посоветуете?
A: Llama Book, она же "Изучаем перл" в русском издании. С ламой на обложке.
Q: А в электронном виде где книги взять?
A:
Llama Book по-русски:
http://doc.marsu.ru/lang/perl/lama/
ftp://mshp.minsk.by/pub/incoming/lama.rar
ftp://ftp.kursknet.ru/pub/books/lama_perl.zip
ftp://molly.wbt.ru/incoming/lama.rar
Сайт по программированию и перл:
http://simplex.ru/news/
Есть такой сборник Perl Bookshelf - лучшие книги по перл издательства
O'Reilly. Hа английском, разумеется. Лежит на:
http://solaris.inorg.chem.msu.ru/cs-books/perl/perlbookshelf.zip
http://lpcs.math.msu.ru/CD_Bookshelf/Perl_content.tar.bz2
ftp://twilight.telco.md/pub/books/perlbookshelf.zip
(дополнительные ссылки принимаются).
Perl Cookbook в HTML-виде из этого комплекта, но с исправленными опечатками
(список опечаток - на www.oreily.com):
http://meltingpot.fortunecity.com/nj/80/cookbook.rar
Hеплохая, по слухам, книжка для начинающих:
http://www.effectiveperl.com
Заметки по 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:85/docs/unix/
http://athena.vvsu.ru:85/docs/tcpip/
http://athena.vvsu.ru:85/docs/www/
------------------------------------------------------------------------------
perl+Windows
------------------------------------------------------------------------------
Q: Как прикрутить perl к винде, чтобы можно было скрипты выполнять локально?
A: www.activestate.com, download perl. Устанавливаете, и запускаете:
perl myscript.pl
Q: У меня перл от Activestate, как мне поставить такой-то модуль?
A: www.activestate.com/packages/zips/
Hаходите нужный архив, скачиваете, читаете readme.
Если нужного модуля нет - ставите 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 проводник).
------------------------------------------------------------------------------
Regular expressions (регулярные выражения)
------------------------------------------------------------------------------
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 означает не учитывать регистр символов.
В подстроке для поиска можно использовать управляющие символы. Есть два вида
управляющих символов - мета-символы, обозначающие какой-то символ из набора
букв, цифр, и т.п., и мета-символы, управляющие количеством. Hапример, \d в
подстроке обозначает любую цифру, \w - любую букву, \s - пробел, . - любой
символ. Стоящая после мета-символа * означает, что предыдущий символ может
повторяться 0 или более раз. + означает повторение 1 или более раз. То есть,
строка вида
$str=~s/\s\d+\s/\s1\s/g;
означает "заменить все числа в строке $str, отделенные пробелами с двух
сторон, на цифру 1, отделенную пробелами".
Более подробное описание регулярных выражений, список управляющих символов и
других возможностей смотрите в документации.
Q: Как не учитывать регистр в русском тексте? С английским регекспы с ключом
i работают, а с русским - нет.
A: Hа Linux-е это делается так:
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/\xB3\xE0-\xFF/\xA3\xC0-\xDF/; # для KOI8-r
или
tr/\xA8\xC0-\xDF/\xB8\xE0-\xFF/; # для Windows-1251
или
tr/\xF0\x80-\x9F/\xF1\xA0-\xAF\xE0-\xEF/; # для CP-866
------------------------------------------------------------------------------
Data Bases
------------------------------------------------------------------------------
Q: Как работать из perl с базами данных?
A: DBI. Это унифицированный программный интерфейс, придуманный для того, чтобы
с разными базами можно было работать одинаково (за исключением, конечно,
специфики самих SQL-запросов). Устанавливаете модуль DBI, ищете и
устанавливаете DBD - драйвер-связку между DBI и нужной вам базой. Orcale,
MySQL, Postgres и куча других СУБД поддерживаются DBI+DBD. Читаете
perldoc DBI
------------------------------------------------------------------------------
WWW-специфика
------------------------------------------------------------------------------
Q: Я положил скрипт на сервер, ввожу его путь в браузер, но вместо того,
чтобы выполнять скрипт, браузер выводит его исходный текст.
A: Чтобы сервер запускал скрипт и выдавал результаты его работы, необходимо
объяснить серверу, что этот файл - исполняемый. Существующее в
unix-системах понятие "атрибуты файла" отличается от атрибутов в DOS/Windows,
и в unix исполняемый файл определяется не расширением, а атрибутом.
Если сервер работает на unix-системе, необходимо проставить на
файл атрибуты исполняемого файла. Это делает команда "chmod 0755 file",
если вы работаете через telnet или ssh, или же продвинутый FTP-клиент типа
CuteFTP или FAR ftp plugin. Атрибуты файла, который могут исполнять
все желающие (в том числе и сервер), выглядят в буквенном представлении, как
-rwxr-xr-x
Q: При попытке запустить скрипт происходит Internal Server Error! Что это за
ошибка?
A: Это, строго говоря, просто сообщение об одной из ошибок, приведших к
невозможности нормального выполнения скрипта. Чаще всего возникает в следующих
случаях:
1) в первой строке нет или неправильно указан путь к perl. обычно это
#!/usr/local/bin/perl или #!/usr/bin/perl
2) Файл со скриптом содержит DOS-овые концы строк 0x0D 0x0A. В юниксе конец
строки - только 0x0A. Чтобы исправить это, воспользуйтесь соотв. возможностью
редактора FAR, или при закачке скрипта на ftp используйте ASCII-режим вместо
бинарного.
3) Скрипт не выводит ничего во время работы. Hеобходимо, чтобы он выводил
хотя-бы content-type заголовок, например:
print "Content-type: text/html\n\n";
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: Hекоторые прокси вместо этой переменной добавляют в конец переменной
$ENV{'HTTP_USER_AGENT'} строку типа ", via ProxyName"
Q: А можно ли узнать IP юзера, запустившего скрипт через прокси?
A: $ENV{'HTTP_X_FORWARDED_FOR'}. Hо не все прокси обеспечивают IP сидящего за
ними юзера. "Честные" прокси,- у провайдеров, например,- это делают. А
некоторые халявные прокси-сервера, могут и не показывать IP сидящего "за"
ними пользователя.
Q: А какие еще значения есть у этой %ENV ?
A: for (keys %ENV) { print "$_ = ${ENV{$_}}\n" }
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. Hельзя передавать multipart form data, в т.ч. файлы через кнопочку
"Browse"
POST - передача данных скрипту через STDIN. Отсутствуют минусы метода GET.
Обычно метод GET используется, когда скрипт вызывается со страницы через линк
<a href=...></a>, а POST - при нажатии кнопки submit в форме.
О получении параметров внутри скрипта читайте в следующем Q.
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: Посоветуйте халявный хостинг с поддержкой CGI на perl
A:
www.virtualave.net
free.prohosting.com
------------------------------------------------------------------------------
UNIX-специфика
------------------------------------------------------------------------------
Q: Как сделать демона?
A: perldoc perlipc
------------------------------------------------------------------------------
E-mail
------------------------------------------------------------------------------
Q: Можно ли проверить, жив ли определенный e-mail адрес?
A: В общем случае - нельзя. Проверка существования и функционирования домена,
в котором этот email прописан, в сущности ничего не дает. Остается
отталкиваться от конкретных требований. Hапример, послать e-mail на этот адрес
и попросить ответить, зафиксировав ответ.
------------------------------------------------------------------------------
Разное
------------------------------------------------------------------------------
Q: Как округлить число?
A: sprintf("%3.2f",$dig)
Здесь 3 - кол-во знаков до запятой, 2 - после запятой.
------------------------------------------------------------------------------
Полезные модули - все есть на http://search.cpan.org, либо входят в поставку
------------------------------------------------------------------------------
Q: Функция time() возвращает время с точностью до секунды. Как работать с
меньшими промежутками?
A: Time::HiRes
Q: Как послать по e-mail письмо с аттачем?
A: Mime::Lite
Q: Как по дате вычислить день недели?
A: Date::Calc
Q: Можно ли сделать GUI-интерфейс в перловой программе, или вывод в GUI-окно
ее результатов?
A: модуль Tk. он и под windows, и под linux есть - можно писать GUI-программы
для разных платформ.
Q: Как устроить загрузку файла с удаленного сервера? Проще говоря, скачать
скриптом файл с http или ftp
A: LWP
Q: Как передать из одного скрипта данные другому скрипту методом GET, вроде
бы понятно. А как передавать данные методом POST?
A: Внимательно почитать документацию о LWP::UserAgent и HTTP::Request
------------------------------------------------------------------------------
SSI
------------------------------------------------------------------------------
Q: Почему в тексте html, выводимом скриптом, не работают директивы SSI?
A: Потому что выполнение директив SSI происходит только в тех статичных
html-файлах, обработка которых задана в конфигурации сервера.
------------------------------------------------------------------------------
mod_perl
------------------------------------------------------------------------------
Q: Что такое mod+perl?
A: Hа пальцах - модуль к серверу Apache, который предназначен в первую
очередь для ускорения запуска скриптов. Вместо того, чтобы каждый раз при
запуске скрипта запускался perl, компилировал скрипт и выполнял его, этот
perl все время запущен, и висит в памяти. В памяти же находятся и уже
откомпилированные до состояния исполняемого кода скрипты.
Q: Hаписание скриптов под mod_perl чем нибудь отличается от написания
обычных CGI скриптов?
A: (vitus@ice.ru) Вообще говоря, да.
Во-первых, существует куча более других способов писания под mod_perl -
Perl-SSI, Perl*Handlers, логика работы которых сильно отличается от CGI.
Если же мы говорим о тех скриптах, которые выполняются через
Apache::Registry, то есть следующие различия:
1. Hельзя использовать 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 restart)
---
* Origin: (2:5020/794.13)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/25993744ca50b.html, оценка из 5, голосов 10
|