Сначала новости: вышла свежая версия 2.0 beta библиотеки CGI::WebOut (описание модуля), предназначенной для того, чтобы побороть 500-ю ошибку и выводить все предупреждения в браузер, а также для ручного перехвата выходного потока скрипта. Скачать и установить можно, как обычно, по адресу:
На всякий случай напомню, что, если Вы уже используете CGI::WebOut, прежде, чем обновлять его, сделайте бэкап старой версии. Все же v2.0 написана только что, в ней не исключены ошибки, хотя это не так уж и вероятно: я поставил новую версию на все сайты, которые используют CGI::WebOut, и они продолжают работать нормально.
Теперь модуль работает в Perl 5.8
Некоторое время назад на форуме по адресу http://forum.dklab.ru/perl/symbiosis/WeboutVPerl58.html выяснилось, что, оказывается, не все так просто и хорошо с модулем CGI::WebOut: он не работает в новом Perl 5.8 зависает. Расследование показало, что в новом Perl без предупреждения изменился механизм связывания потоков, и теперь при копировании файловых переменных связи для них тоже копируются. Иными словами, если я раньше писал:
и получал вывод текста на «настоящий», несвязанный STDOUT, то теперь такие штучки не проходят.
Соответственно, чтобы добраться до «исходного» потока, придется в буквальном смысле подать энергию на жесткие диски: отвязать от STDOUT объект-обработчик, привязать старый, выполнить операцию, а затем заново привязать основной объект. Просто? Не совсем.
Первая проблема заключалась в том, что Perl не умеет привязывать к переменным готовые объекты, он умеет только их создавать, а уж затем без спросу привязывать. К счастью, обмануть его оказалось несложно:
{{{
# Пакет для "обмана" функции tie().
package TieMediator;
# Perl-то думает, что мы вернем новый объект,
# а мы беззастенчиво подсовываем ему другой -
# тот, который указан в параметрах.
sub TIEHANDLE { return \$_[1] }
}}}
# Пример вызова этой функции:
# my \$obj = new SomeClass();
# ...
# tieobj(*STDOUT, \$obj);
sub tieobj {
# Передаем в параметрах указанный объект.
return tie(\$_[0], "TieMediator", \$_[1])
}
Раньше CGI::WebOut монопольно захватывал себе STDOUT и плевал на то, что его, возможно, до этого еще кто-то перехватил. Те, на кого он плевал, обижались и выдавали разные ошибки. Например, помню, очень расстроился модуль для работы FastCGI, потому что он переставлял STDOUT на себя, а последующее подключение CGI::WebOut портило ему все карты. Теперь этой проблемы быть не должно.
Говоря общими фразами, CGI::WebOut теперь стал прозрачным для операции tie(). Напишем такой скрипт:
не зависит от того, закомментирована ли строчка, помеченная как «***», или нет. Это и означает «прозрачность» модуля для операции tie().
Вы можете заглянуть в комментарии внутри модуля там еще много интересного понаписано.
Что еще изменилось
Интерфейс модуля остался без изменений. Иными словами, функции называются так же и выполняют ту же самую работу, что и раньше. Тем не менее, львиная часть модуля была переписана практически с нуля, и, я думаю, от этого вся библиотека стала немного лучше.
В частности, я решил наконец отказаться от AutoLoader-а: по слухам он только замедлял работу, потому что сам достаточно велик.
Как завещал великий Ленин, модуль теперь нормально работает в режиме use strict. Теоретически это позволяет писать более корректный код и легче обнаруживать ошибки в модуле. На практике же пришлось рассовать везде инструкции our, потому что писать вместо них use var ... слишком уж нудно. Так что, если ваша версия Perl настолько стара (на практике — примерно пятилетней давности), что не поддерживает our, придется от модуля отказаться, ну или же обновить Perl.
автор категорически против копирования и распространения в Интернете всех статей «Куроводства» с возрастом, меньшим 6 месяцев. Печальный опыт «расползания» чрезвычайно устаревших ошибочных версий статьи про Apacheдействительно объясняет такое решение.
Орфография на «Куроводстве»:
если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмитеCtrl+Enter. Выделенный текст будет немедленно отослан вебмастеру, а Вы даже ничего и не заметите настолько быстро все произойдет.
На заметку:
если вы уже вскипели насчет дизайна этой страницы, то присмотритесь повнимательнее к названию, почитайте FAQ, сходите , как это уже предлагалось выше. Можно ли считать пародию плагиатом? Надеюсь, что нет.