|   | 
Общие вопросы
 
Книжки
 
 
perl+Windows
 
 
Regular expressions (регулярные выражения)
 
 
Data Bases
 
 
Примеры функций, разное
 
 
 
E-mail
 
 
WWW,CGI-специфика
 
 
-  Я положил скрипт на сервер, ввожу его путь в браузер, но вместо того, чтобы выполнять скрипт, браузер выводит его исходный текст.
 
 -  При попытке запустить скрипт происходит 500 Internal Server Error! Что это за ошибка?
 
 -  Как узнать IP человека, вызвавшего скрипт?
 
 -  Как узнать, с какой страницы идет ссылка на скрипт?
 
 -  Как узнать IP прокси, если через нее запустили скрипт?
 
 -  А можно ли узнать IP юзера, запустившего скрипт через прокси?
 
 -  А какие еще значения есть у этого %ENV?
 
 -  Как запускать скрипт на сервере через определенные промежутки времени, или в определенное время суток, день недели, месяц?
 
 -  Как, зная ip, получить имя (DNS), за которым этот ip закреплен?
 
 -  Что такое method GET, и что такое method POST?
 
 -  Как обрабатывать параметры, переданные скрипту?
 
 -  Посоветуйте халявный хостинг с поддержкой CGI-perl.
 
 -  Что надо указатьв заголовках HTTP-ответа CGI скрипта, выводящего содержимое, которое надо не показать на экране, а сохранить в файле с заданным именем, например 'download.zip' ? А то браузер сохраняет файл с именем скрипта.
 
 -  Директивы SSI не обрабатываются в выводе скрипта. Что делать?
 
  
 
Примеры скриптов
 
 
Задачки
 
 
 
 
Общие вопросы
 
 
 
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 - тоже интересно )window.location='http://www.wallst.ru/err/error.phtml?err=404')  
 
В большинстве статей документации есть примеры кода.
 
Если с вашим дистрибутивом perl не поставляется perldoc - выкиньте этот дистрибутив. 
 
Что еще можно найти в perldoc:
 
 
| perl | О перле вообще |  
 
| perldelta | Что нового в последней версии перла |  
 
| perlfaq | FAQ |  
 
| perltoc | Подробное оглавление ко всей документации |  
 
| perldata | Типы данных |  
 
| perlsyn | Синтаксис языка |  
 
| perlop | Операции перл |  
 
| perlre | Регулярные выражения |  
 
| perlrun | Опции командной строки |  
 
| perlfunc | Встроенные функции |  
 
| perlvar | Специальные переменные |  
 
| perlsub | Функции (процедуры) |  
 
| perlmod | Модули |  
 
| perlmodlib | Модули: создание собственных библиотек |  
 
| perlmodinstall | Установка модулей CPAN |  
 
| perlform | Форматы |  
 
| perllocale | Локализация |  
 
| perlref |  Ccылки и указатели на данные |  
 
| perldsc | Введение в структурные типы данных |  
 
| perllol | Структуры данных: массивы и списки |  
 
| perltoot | Тьюториал по объектно-ориентированному программированию |  
 
| perlobj | Объекты в перле |  
 
| perltie | Связь объектов с обыкновенными переменными |  
 
| perlbot | Perl OO tricks and examples |  
 
| perlipc | Связь между процессами |  
 
| perldebug | Отладка программ |  
 
| perldiag | Сообщения об ошибках |  
 
| perlsec | Вопросы безопасности |  
 
| perlembed | Способы внедрения перл-программ в программы на C/C++ |  
 
| perlapio | Собственный API, использумый в исходниках перла |  
 
| perlxs | XS -- программирование перловских библиотек,
 
 используемых вместе с библиотеками на C |  
 
| perlxstut | Учебник по XS |  
 
| perlguts | Внутренние функции перла для разработчиков |  
 
| perlcall | Соглашения о вызове перловских функций из C |  
 
| perlhist | История и полный список всех версий перла |  
 
| perlbook | Книги |  
 
| lwpcook | "Поваренная книга" LWP |  
 
 
 
Читайте доку бо она рулез!  
 
 
 
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+Windows
 
 
 
 
Q: Как прикрутить 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:
 
(? attern) - это почти (pattern). В норме круглые скобки выполняют
 
одновременно две функции - группируют то, что у них внутри, чтобы можно было
 
использовать повторители (*,?, +), и сохраняют то, что там получилось, в
 
переменных $1, $2,.. (? attern) выполняет только первую функцию, не
 
трогая, таким образом, значения переменных $1, $2,... Что несколько ускоряет
 
работу (пропорционально количеству откатов, проходящихчерез границу
 
выбранной группы) и уменьшает количество переменных. (?=pattern) -заглядвперед. Отличается от просто pattern тем, что после
 
успешного нахождения соответствияпозиция в строке будет не после
 
соответствующего куска, а перед ним. (?!pattern) - отрицательный загляд вперед. Отличается от предыдущего тем, что
 
pattern найтись HЕ должен. Вторыеоба наиболее осмысленны, когда привязаны к чему-нибудь (^, \G, просто
 
предшествующему шаблону). Hо в некоторых ситуациях осмысленны и сами по себе. В perl 5.005появились различные нововведения, о которых подробнее можно
 
узнать в документации:?<=, ?<!, ?{code}, ?>,
 
?(condition)yes-pattern|no-pattern
 
 
 
Data Bases
 
 
 
 
Q: Как работать из 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,..
 
 
 
E-mail
 
 
 
 
Q: Как послать e-mail из скрипта? 
 
A: Воспользоваться утилитой sendmail (есть на всех unix системах) 
 
Пример: 
 
open MAIL, '|/path/to/your/sendmail -t';  
 
print MAIL "From: [email protected]\n", 
 
"To: [email protected]\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:
 
 
sub ReLocate
 
{
 
 my($url,$cookie)=@_;
 
 print "Status: 302 Moved\n";
 
 if ($cookie ne '') { print "Set-Cookie: $cookie\n" }
 
 print "Location: $url\n\n";
 
} 
 
Примечание: 
 
Не забудьте, что URL должен быть полным, частичные "не прокатывают" под некоторыми ОС и веб-серверами.
 
 
 
 
Q: Вечная тема - закачка файла на сервер(upload). 
 
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 => 'МИСС ИHТЕРHЕТ', # напечатать заголовок и $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; # напечатать
 
}
 
# Этот скрипт никому не мешает вводить мусор (например 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 ("Hе могу создать $DIR/$1: $!"); # ошибка или такой файл уже есть
 
}
 
# Портятся файлы при посылке? См. ниже!
 
else # все в порядке - файл создан
 
{
 
 binmode FILE; # включить binmode для Windows
 
 print FILE while (<$foto>); # и скопировать данные в файл
 
 close FILE;
 
 print h1 ('Сердечное Вам спасибо!'); # воспитывать как собак Павлова
 
}
 
print end_html; # напечатать
 
==========================
 
 
 
Если закачка некоторых файлов происходит с глюками - видимо, файл
 
перекодируется на лету русским апачем.
 
Варианты решения: 
 
1.запретите все перекодировки для скрипта, который разбирает FileUpload,
 
например таким способом: 
 
 CharsetDisable On 
 
 и делайте перекодировку сами. 
 
2.Используйте директиву CharsetRecodeMultipartForms, которая появилась в PL23,
 
но при этом вам все равно придется перекодировать вручную текстовые части
 
запросов. Для этого можно использовать Russian Apache API, доступное в других
 
модулях или Russian Apache Perl API, доступное из mod_perl.
 
 
 
Задачки
 
 
 
 
Hello, world!
 
 
 
$_=q$qsjou<vd<r<aia+<rr<bfmmp+<xpsme=\ob$;
 
y?<-@*-.b-z? -$+-/a-y?;s=\D+=$&=ee
 
 
	
 | 
  |