Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу).
Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу). Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу). Homepage Карта сайта Версия для печати

Джентльменский набор Web-разработчика   Ларри Уолл о Perl6   Наблы Система Orphus
 

33. CGI::WebOut: новая жизнь старых модулей

[24 августа 2003 г.] обсудить статью в форуме

Сначала новости: вышла свежая версия — 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 без предупреждения изменился механизм связывания потоков, и теперь при копировании файловых переменных связи для них тоже копируются. Иными словами, если я раньше писал:

Листинг 1
*THE_REAL_STDOUT = STDOUT;
tie(*STDOUT, "MyClass");
...
print THE_REAL_STDOUT "Какая-то строка";

и получал вывод текста на «настоящий», несвязанный STDOUT, то теперь такие штучки не проходят.

Соответственно, чтобы добраться до «исходного» потока, придется в буквальном смысле подать энергию на жесткие диски: отвязать от STDOUT объект-обработчик, привязать старый, выполнить операцию, а затем заново привязать основной объект. Просто? Не совсем.

Первая проблема заключалась в том, что Perl не умеет привязывать к переменным готовые объекты, он умеет только их создавать, а уж затем — без спросу привязывать. К счастью, обмануть его оказалось несложно:

Листинг 2
{{{
# Пакет для "обмана" функции 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(). Напишем такой скрипт:

Листинг 3
#!/usr/bin/perl -w
tie(*STDOUT, "T");
eval "use CGI::WebOut"; # *** - попробуйте убрать
print "OK!";
untie(*STDOUT);

package T;
sub TIEHANDLE { print STDERR "TIEHANDLE\n"; bless {} }
sub UNTIE { print STDERR "T::UNTIE" }
sub PRINT { print STDERR "T::PRINT ".length(\$_[1])."\n" }

Результат его работы:

Листинг 4
T::TIEHANDLE
T::PRINT 3
T::UNTIE

не зависит от того, закомментирована ли строчка, помеченная как «***», или нет. Это и означает «прозрачность» модуля для операции tie().

Лирическое отступление 
Вы можете заглянуть в комментарии внутри модуля — там еще много интересного понаписано.

Что еще изменилось

Интерфейс модуля остался без изменений. Иными словами, функции называются так же и выполняют ту же самую работу, что и раньше. Тем не менее, львиная часть модуля была переписана практически с нуля, и, я думаю, от этого вся библиотека стала немного лучше.

В частности, я решил наконец отказаться от AutoLoader-а: по слухам он только замедлял работу, потому что сам достаточно велик.

Как завещал великий Ленин, модуль теперь нормально работает в режиме use strict. Теоретически это позволяет писать более корректный код и легче обнаруживать ошибки в модуле. На практике же пришлось рассовать везде инструкции our, потому что писать вместо них use var ... слишком уж нудно. Так что, если ваша версия Perl настолько стара (на практике — примерно пятилетней давности), что не поддерживает our, придется от модуля отказаться, ну или же обновить Perl.

обсудить статью в форуме

 
Рекламный блок
   

На странице:
    33. CGI::WebOut: новая жизнь старых модулей
Теперь модуль работает в Perl 5.8
Что еще изменилось

Важное объявление:
    автор категорически против копирования и распространения в Интернете всех статей «Куроводства» с возрастом, меньшим 6 месяцев. Печальный опыт «расползания» чрезвычайно устаревших ошибочных версий статьи про Apache действительно объясняет такое решение.

Орфография на «Куроводстве»:
    если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Выделенный текст будет немедленно отослан вебмастеру, а Вы даже ничего и не заметите — настолько быстро все произойдет.

На заметку:
    если вы уже вскипели насчет дизайна этой страницы, то присмотритесь повнимательнее к названию, почитайте FAQ, сходите по лебедевским местам, как это уже предлагалось выше. Можно ли считать пародию плагиатом? Надеюсь, что нет.

Параметры этой страницы
   
GZip

Ссылки от спонсоров
    Для удобства можно воспользоваться сортировкой работы по отраслям.


Дмитрий Котеров | 24 августа 2003 г. ©1999-2018 | Генеральный спонсор: Хостинг «Джино» | Контакт Вернуться к оглавлению