Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу).
Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу). Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу). 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

Ссылки от спонсоров
    Timberland.


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