Титульная страница
ISO 9000 ISO 14000 Forum
Титульная страница
Цель системы качества
Управление качеством
ISO
ISO 9000
ISO 13485
ISO 14000
ISO 17025
OHSAS 18001
ISO 19011
Total Quality Management
Project Management
Фармацевтика
Отраслевые стандарты
Информационные технологии
Оформление документации
Ссылки 
Поиск на сайте
Forum
Реклама на сайте





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


Книжки



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
Hosted by uCoz