Титульная страница
ISO 9000 ISO 14000
GMP Consulting
 

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


Книжки



perl+Windows



Regular expressions (регулярные выражения)



Data Bases



Примеры функций, разное




E-mail



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:






































perlО перле вообще
perldeltaЧто нового в последней версии перла
perlfaqFAQ
perltocПодробное оглавление ко всей документации
perldataТипы данных
perlsynСинтаксис языка
perlopОперации перл
perlreРегулярные выражения
perlrunОпции командной строки
perlfuncВстроенные функции
perlvarСпециальные переменные
perlsubФункции (процедуры)
perlmodМодули
perlmodlibМодули: создание собственных библиотек
perlmodinstallУстановка модулей CPAN
perlformФорматы
perllocaleЛокализация
perlref Ccылки и указатели на данные
perldscВведение в структурные типы данных
perllolСтруктуры данных: массивы и списки
perltootТьюториал по объектно-ориентированному программированию
perlobjОбъекты в перле
perltieСвязь объектов с обыкновенными переменными
perlbotPerl OO tricks and examples
perlipcСвязь между процессами
perldebugОтладка программ
perldiagСообщения об ошибках
perlsecВопросы безопасности
perlembedСпособы внедрения перл-программ в программы на C/C++
perlapioСобственный API, использумый в исходниках перла
perlxsXS -- программирование перловских библиотек,
используемых вместе с библиотеками на 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: 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:

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
 
Rambler's Top100