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


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Sly Golovanov                        2:5020/794.13  10 Jul 2000  05:00:01
 To : All
 Subject : FAQ 1/3
 -------------------------------------------------------------------------------- 
 
                Perl FAQ created by SLY Golovanov, 2:5020/794.13
 
                        Последнее обновление 6 июля 2000
                  Обновления выделяются символом ">" в начале
 ==============================================================================
 Спасибо to:
 
 Artem Chuprina, 2:5020/371.32
 Victor Vagner, vitus@ice.ru
 ==============================================================================
   Общие вопросы
 ------------------------------------------------------------------------------
 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:
 Perl Cookbook. Переведенена как "Perl. Библиотека программиста". Список
 конкретных задач и их решений, плюс уроки хорошего стиля программирования.
 
 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://lpcs.math.msu.ru/CD_Bookshelf/Perl/
 
   В виде архива ее можно взять как
   http://lpcs.math.msu.ru/CD_Bookshelf/Perl_content.tar.bz2
   ftp://twilight.telco.md/pub/books/perlbookshelf.zip
   http://solaris.inorg.chem.msu.ru/cs-books/perl/perlbookshelf.zip
   ftp://freebsd.svib.ru:21/incoming/ora/perlbookshelf.zip
 
 (дополнительные ссылки принимаются).
 
 Perl Cookbook в HTML-виде из этого комплекта, но с исправленными опечатками
 (список опечаток - на www.oreily.com):
 
   http://meltingpot.fortunecity.com/nj/80/cookbook.rar
 
 Hеплохая, по слухам, книжка для начинающих:
 
   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/
 
 ------------------------------------------------------------------------------
   perl+Windows
 ------------------------------------------------------------------------------
 Q: Как прикрутить perl к винде, чтобы можно было скрипты выполнять локально?
 A: www.activestate.com, download perl. Устанавливаете, и запускаете:
   perl myscript.pl
 
 Q: У меня перл от Activestate, как мне поставить такой-то модуль?
 A: www.activestate.com/packages/zips/
 Hаходите нужный архив, скачиваете, читаете 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 проводник).
 ------------------------------------------------------------------------------
   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а 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/\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::something  -  драйвер-связку между DBI и нужной вам базой.
 Oracle,  MySQL, PostgreSQL и куча других СУБД поддерживаются DBI+DBD.  Читаете
 perldoc DBI
 ------------------------------------------------------------------------------
   Функции
 ------------------------------------------------------------------------------
 Q: Хочу прочитать список файлов в каталоге, но почему-то не работает или
 глючит. Делаю так:
 @files=<*>;
 A: Такой способ вызывает внешнюю программу glob (также, как и способ
 @files=glob("*")). Это неправильно не только потому, что на запуск внешней
 программы уходит время и ресурсы, но и потому, что где-нибудь этой программы
 может просто не оказаться. Более правильный способ - это:
 
 opendir DIR,'/tmp';
 @files=readdir DIR;
 closedir DIR;
 
 или 
 
 opendir DIR,'/tmp';
 while $file (readdir DIR)
 {
 }
 closedir DIR;
 
 Заметьте, что в $file будут подставляться как имена файлов, так и имена
 подкаталогов.
 Hесколько подсказок. Чтобы прочесть список файлов, в котором не содержалось
 бы '.' и '..', можно написать следующее:
 
 opendir DIR,'/tmp';
 @files=grep !/^\.+$/,readdir DIR;
 closedir DIR;
 
 Таким же способом,- с помощью regexp,- можно задавать любые другие маски
 файлов.
 Если вы хотите прочесть список каталогов, не трогая файлы:
 
 opendir DIR,/tmp';
 @dirs=grep {!/^\.+$/ and -d "/tmp/$_"} readdir DIR;
 closedir DIR;
 
 ------------------------------------------------------------------------------
   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  (shift-f2,  as  Unix  text),  или  при  закачке скрипта на 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екоторые прокси добавляют в конец заголовка строку типа
 ", via ProxyName", и в результате вместо переменной HTTP_VIA эту строку можно 
 наблюдать в конце переменной $ENV{'HTTP_USER_AGENT'}  
 
 Q: А можно ли узнать IP юзера, запустившего скрипт через прокси?
 A: $ENV{'HTTP_X_FORWARDED_FOR'}. Hо не все прокси обеспечивают 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. 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
 www.hypermart.net
 
 ------------------------------------------------------------------------------
   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, либо входят в
 поставку.
   екоторые есть и для Activestate Perl, www.activestate.com/packages/zips/
 ------------------------------------------------------------------------------
 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: Как передать из одного скрипта данные другому скрипту методом GET, вроде
 бы понятно. А как передавать данные методом POST?
 A: Внимательно почитать документацию о LWP::UserAgent и HTTP::Request
 
 Q: Как создавать графические файлы на лету?
 A: GD
 
 ---
  * Origin:  (2:5020/794.13)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 FAQ 1/3   Sly Golovanov   10 Jul 2000 05:00:01 
Архивное /ru.perl/259937c3ae658.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional