|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Общие вопросы
Книжкиperl+Windows
Regular expressions (регулярные выражения)
Data BasesПримеры функций, разное
WWW,CGI-специфика
Примеры скриптовЗадачкиОбщие вопросыQ: Что такое Perl? A: Practical Extraction and Report Language. Язык программирования, который задумывался, как удобный язык для работы со строками, и не стесненный, к тому же, ограничениями, свойственными другим языкам. Фактически, получился удобный язык, на котором программы быстро пишутся (в общем случае это не значит, что они работают быстрее, например, программ С++ - но написать код можно точно быстрее) Q: Кто его придумал? A: Larry Wall. А развивается он при помощи тысяч энтузиастов по всему миру. Q: Для чего его используют? A: Самое распространенное использование - в качестве CGI-программ, выполняемых на интернет-сайтах. Q: Под какие платформы он существует? A: perl 5 - под практически все виды UNIX-систем (Linux, FreeBSD, SunOS,..), DOS (защищенный режим, i386 и выше), Windows 9x/NT, OS/2, VAX VMS, Novell Netware. Amiga.. Q: Сайт перла какой? Где взять последнюю версию? A: www.perl.com ; для windows - www.activestate.com Q: А компилятор где взять? A: www.indigostar.com (платный) Q: Как сделать то-то? Может, уже есть готовая библиотека? A: http://www.perl.com/CPAN/ http://search.cpan.org CPAN (Comprehensive Perl Archive Network) - огромное, отсортированное собрание всех дополнительных модулей к perl, не включенных в поставку. Собраны все версии модулей. Рядом с ними лежат readme. Скачиваете, и устанавливаете. В 90% случаев то, что вы пытаетесь сделать, уже кто-то сделал и выложил на CPAN. 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 -q <строка> - поиск по ФАК'у: perldoc perldoc - тоже интересно В большинстве статей документации есть примеры кода. Если с вашим дистрибутивом perl не поставляется perldoc - выкиньте этот дистрибутив. Что еще можно найти в perldoc:
Читайте доку бо она рулез! Q: Какие существуют редакторы для написания программ, с подсветкой? A: Мультиплатформенный - vim, emacs, xemacs Под win32 - FAR с плагином Colorer, perl scripting tool EditPlus и множество других КнижкиQ: Какую книгу для начинающих посоветуете? A: Llama Book(книжка с Ламой на обложке), она же "Изучаем перл" в русском издании. С ламой на обложке. Q: А для продолжающих? A: Perl Cookbook. Переведенена как "Perl. Библиотека программиста". Список конкретных задач и их решений, плюс уроки хорошего стиля программирования. Q: А в электронном виде где книги взять? A: Llama Book по-русски: ftp://molly.wbt.ru/incoming/lama.rar http://ag.ru/files/llama.exe Есть такой сборник Perl Bookshelf - лучшие книги по перл издательства O'Reilly. Hа английском, разумеется. Лежит на: 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: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+WindowsQ: Как прикрутить perl к винде, чтобы можно было скрипты выполнять локально? A: www.activestate.com, download perl. Устанавливаете, и запускаете: perl myscript.pl Q: У меня перл от Activestate, как мне поставить такой-то модуль? A1: ppm ppm> install <модуль> A2: www.activestate.com/packages/zips/ Hаходите нужный архив, скачиваете, читаете readme. Если нужного модуля нет - идёте на CPAN, ищете его там, пытаетесь понять, как его прикрутить. С некоторой вероятностью он чисто перловый, и тогда есть шанс, что просто положив его в директорию с модулями, вы получите работающий модуль. Если же у него есть С-часть, ставите MS Visual C, и мучаетесь, мучаетесь... Q: А из браузера как смотреть на вывод скрипта? Почему-то показывается исходник. A: Потому что между браузером и perl должен стоять сервер, который и запускает скрипт на выполнение, отдавая результат браузеру. Сервер не обязательно подразумевает под собой отдельный компьютер - вы можете поставить себе программу, и обращаться к ней через браузер, наблюдая за работой скриптов. Вариантов масса: Apache-W32, www.apache.org Personal Web Server из поставки Win9x Sambar, www.sambar.com Устанавливаете сервер, и либо указываете в настройках сервера ассоциацию на файлы cgi и pl - запуск perl.exe, либо устанавливаете такую ассоциацию на эти файлы в windows. Q: Как заставить работать связку perl + MySQL под виндой? A: Скачать дистрибутив MySQL с сайта (www.mysql.com), установить необходимые модули - DBI и DBD:MySQL. Неплохой тьюториал по установке Perl+Apache+MySql http://userguide.webservis.ru/ 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/ 1 /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 Q: Кто-нибудьможет мне по-русски рассказать о операорах: ?:, ?!, ?= и т.д. и когда они используются? A: (? одновременно две функции - группируют то, что у них внутри, чтобы можно было использовать повторители (*,?, +), и сохраняют то, что там получилось, в переменных $1, $2,.. (? трогая, таким образом, значения переменных $1, $2,... Что несколько ускоряет работу (пропорционально количеству откатов, проходящихчерез границу выбранной группы) и уменьшает количество переменных. (?=pattern) -заглядвперед. Отличается от просто pattern тем, что после успешного нахождения соответствияпозиция в строке будет не после соответствующего куска, а перед ним. (?!pattern) - отрицательный загляд вперед. Отличается от предыдущего тем, что pattern найтись HЕ должен. Вторыеоба наиболее осмысленны, когда привязаны к чему-нибудь (^, \G, просто предшествующему шаблону). Hо в некоторых ситуациях осмысленны и сами по себе. В perl 5.005появились различные нововведения, о которых подробнее можно узнать в документации:?<=, ?<!, ?{code}, ?>, ?(condition)yes-pattern|no-pattern Data BasesQ: Как работать из perl с базами данных? A: DBI. Это унифицированный программный интерфейс, придуманный для того, чтобы с разными базами можно было работать одинаково (за исключением, конечно, специфики самих SQL-запросов). Устанавливаете модульDBI (Data Base Interface), ищете и устанавливаете DBD::something (Data Base Driver) - драйвер-связку между DBI и нужной вам базой. Oracle, MySQL, PostgreSQL и куча других СУБД поддерживаются DBI+DBD. Читаете perldoc DBI Примеры функций, разноеQ: Как округлить число? A: sprintf("%3.2f",$i) Здесь 3 - кол-во знаков до запятой, 2 - после запятой. Q: Как получить текущую дату и время? A: Функция time() возвращает время в unix-формате - количество секунд, прошедших с 1 января 1970 года. Функция localtime() возвращает дату и время. В контексте массива - значения секунд, минут, и т.п. раздельно, в скалярном контексте - строку определенного формата. Подробнее см. perldoc -f localtime Q: Функция time() возвращает время с точностью до секунды. Как работать с меньшими промежутками? A: Time::HiRes Q:Как по дате вычислить день недели? A1: perldoc -f localtime A2: Date::Calc Q: Как, зная дату и время, получить количество секунд, прошедших до этого времени с 1970 года (unix-time format)? A: Time::Local Q: Можно ли сделать GUI-интерфейс в перловой программе, или вывод в GUI-окно ее результатов? A: модуль Tk. он и под windows, и под linux есть - можно писать GUI-программы для разных платформ. Q: Как устроить загрузку файла с удаленного сервера? Проще говоря, скачать скриптом файл с http или ftp A: LWP, Net::Ftp Q: Как передать из одного скрипта данные другому скрипту методом GET, вроде бы понятно. А как передавать данные методом POST? A: Внимательно почитать документацию о LWP::UserAgent и HTTP::Request + perldoc lwpcook Q: Как создавать графические файлы на лету? A: модуль GD, или внешние программы: Imagemagick, fly,.. Q: Как послать e-mail из скрипта? A: Воспользоваться утилитой sendmail (есть на всех unix системах) Пример: open MAIL, '|/path/to/your/sendmail -t'; print MAIL "From: mail@my.host\n", "To: webmaster@my.host\n", "Subject: Mail from perl script!\n\n", $message; close MAIL; Q: Sendmail это хорошо, а как из под виндов? A: Есть sendmail под винды, платный, бесплатный и даже от M$. Q: Как послать по e-mail письмо с аттачем? A: rfc2045, rfc2046, perldoc Mime::Lite Q: Можно ли проверить, существует ли определенный e-mail адрес? A: В общем случае - нельзя. Проверка существования и функционирования домена, в котором этот email прописан, в сущности ничего не дает. Остается отталкиваться от конкретных требований. Hапример, послать e-mail на этот адрес и попросить ответить, проверив ответ. WWW,CGI-специфика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, и выбрать perl\bin\perl.exe в качестве запускающей программы. Q: При попытке запустить скрипт происходит 500 Internal Server Error! Что это за ошибка? A: Это, строго говоря, просто сообщение об одной из ошибок, приведших к невозможности нормального выполнения скрипта. Узнать что же привело к этому можно в большинстве случаев из логов сервера.(*) Чаще всего возникает в следующих случаях: 1) в первой строке отсутствует или неправильно указан путь к perl. обычно это #!/usr/local/bin/perl или #!/usr/bin/perl 2) Файл со скриптом содержит DOS-овые концы строк 0x0D 0x0A. В юниксе конец строки- только 0x0A. Чтобы исправить это, воспользуйтесь соотв. возможностью редактора FAR(shift-f2, asUnix text), или призакачке скрипта на ftp используйте ASCII-режим вместо бинарного. 3) Скрипт невыводит ничего во время работы, или не выводит заголовок. Hеобходимо, чтобы он выводил хотя бы content-type заголовок, например: print "Content-type: text/html\n\n"; print "Ok"; Обратите внимание на двойной перевод строки в конце заголовка. (*)Примечание: Если у вас нет доступа к логу ошибок сервера, для отладки скрипта используйте директиву use CGI::Carp qw (fatalsToBrowser); В этом случае при фатальной ошибке, приводящей к завершению скрипта, эта ошибка будет видна вам в браузере. Q: Как узнать IP человека, вызвавшего скрипт? A: $ENV{'REMOTE_ADDR'} Q: Как узнать, с какой страницы идет ссылка на скрипт? A: $ENV{'HTTP_REFERER'} Q: Как узнать IP прокси, если через нее запустили скрипт? A1 $ENV{'HTTP_VIA'} A2: 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(" ",map("$_ = $ENV{$_}", keys %ENV)); Q: Как запускать скрипт на сервере через определенные промежутки времени, или в определенное время суток, день недели, месяц? A: Это возможно, если есть шелл-доступ на сервер. Читайте man crontab Q: Как, зная ip, получить имя (DNS), за которым этот ip закреплен? A: Встроенная функция gethostbyaddr() Q: Что такое method GET, и что такое method POST? A1: rfc2616 A2: GET - передача параметров скрипту из строки location браузера. Пример: script.cgi?mode=aa&type=bb&length=12 Минусы этого метода: 1. Все параметры видны в строке. Если в кач-ве параметров передается пароль - получается дырка в безопасности 2. Длина данных, передаваемых таким методом, ограничена. 3. Hельзя передавать multipart form data, в т.ч. файлы через кнопочку "Browse" POST - передача данных скрипту через STDIN. Отсутствуют минусы метода GET. Обычно метод GET используется, когда скрипт вызывается со страницы через линк , а POST - при нажатии кнопки submit в форме. О получении параметров внутри скрипта читайте в следующем Q. Q: Как обрабатывать параметры, переданные скрипту? A1: Используйте модуль CGI. Прочтите perldoc CGI , а для начала простой пример: use CGI; $q=new CGI(); $mode=$q->param('mode'); $q - объект, который имеет несколько методов и полей, относящихся к параметрам вызова, переменным окружения, cookie, и пр. В $mode содержится значение параметра 'mode'. или проще: use CGI qw/:standard/; $mode=param('mode'); если вам не нужно несколько объектов. A2: Некоторые предпочитают пользоваться библиотекой cgi-lib (она тоже входит в модуль CGI, хотя существуют индивидуумы, которые включают ее отдельным файлом). Пример: use CGI qw(:cgi-lib); ReadParse(); #Функция возвращает все параметры в хэш. $mode=$in{'mode'}; A3: Можно пойти по пути изобретения велосипеда и начать переписывать модуль CGI, т.е. разбор параметров метода GET, потом наверняка понадобиться POST, а потом multipart form data. В написанный код закрадуться ошибки, которые придется отлавливать на последующих этапах. Это конечно дает неплохую практику программирования, но лучше просто посмотрите как написан модуль CGI. (Высказанное в последнем ответе является тем самым ИМХО Q: Посоветуйте халявный хостинг с поддержкой CGI-perl. A:www.virtualave.net free.prohosting.com www.hypermart.net www.virtualave.net www.webservis.ru www.h1.ru www.holm.ru www.hut.ru Примечание: В последнее время почти все халявные хостинги перестали поддерживать исходящие запросы, т.е. скачать откуда-нибудь файл используя LWP или Net::Ftp не получиться. Если знаете хостинг с поддержкой исходящих запросов, напишите мне, буду благодарен. Q: Что надо указатьв заголовках HTTP-ответа CGI скрипта, выводящего содержимое, которое надо не показать на экране, а сохранить в файле с заданным именем, например 'download.zip' ? А то браузер сохраняет файл с именем скрипта. A: print "Content-Type: application/octet-stream\nContent-Length: ", -s 'download.zip' ,"\n"; print "Content-Disposition: attachment; filename=download.zip\n\n"; Q: Директивы SSI не обрабатываются в выводе скрипта. Что делать? A: Есть специальный модуль - CGI::SSI. Примеры скриптовQ: Как одновременно поставить куки и сделать редирект? A:
Примечание: Не забудьте, что URL должен быть полным, частичные "не прокатывают" под некоторыми ОС и веб-серверами. Q: Вечная тема - закачка файла на сервер(upload). A:
Если закачка некоторых файлов происходит с глюками - видимо, файл перекодируется на лету русским апачем. Варианты решения: 1.запретите все перекодировки для скрипта, который разбирает FileUpload, например таким способом: CharsetDisable On и делайте перекодировку сами. 2.Используйте директиву CharsetRecodeMultipartForms, которая появилась в PL23, но при этом вам все равно придется перекодировать вручную текстовые части запросов. Для этого можно использовать Russian Apache API, доступное в других модулях или Russian Apache Perl API, доступное из mod_perl. ЗадачкиHello, world!
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|