![]() |
![]() |
|
||
![]() |
|
||||||||||||||||||||||||||||||||||||
Ужасы и реалии модуля CGI.pm |
Тише! Слышите?.. Ах, ну Хотя нет, не лучше. Теперь я слышу стоны. Стоны дизайнеров и HTML-верстальщиков. Это люди, воюющие на фронтах, далеких от страны программирования. Для них приведенный выше |
Итак, приблизим Perl по удобству программирования к PHP, сохранив в то же время все его лучшие качества. Для этого нужно проделать 3 шага:
Комплексная проблема, в отличие от такого же обеда, смертельна не всегда. В нашем случае мы сначала рассмотрим мощный модуль CGI::WebOut, который решает первую часть проблемы. Следующие наблы будут посвящены оставшимся задачам.
В предыдущей набле мы в деталях рассмотрели способ, позволяющий побороть 500-ю ошибку и выводить все предупреждения прямо в окно браузера, что неоценимо при отладке скриптов. Чтобы не писать весь этот код каждый раз, я сгруппировал его и множество других возможностей в модуле CGI::WebOut, который вы можете скачать из архива по адресу http://www.dklab.ru/chicken/mod/ppd (для Windows) или http://www.dklab.ru/chicken/mod/cpan (для Unix). О том, как устанавливать модули в различных операционных системах, читайте в следующей набле.
Предположим, CGI::WebOut установлен. На примерах посмотрим, что мы теперь можем делать.
Избавление от 500-й ошибки, печать предупреждений в браузер
#!/usr/bin/perl -w use CGI::WebOut; # ух ты, мы можем даже не выводить Content-type! print "Hello world!"; warn "Последнее предупреждение.\n"; # попробуйте раскомментировать следующую строчку # (вызов несуществующей функции, порождающий ошибку): #no_such_function();
Вывод заголовков уже после вывода тела
#!/usr/bin/perl -w
use CGI::WebOut;
# указываем, что заголовки могут выводиться и после тела
NoAutoflush();
print "Hello world! ";
# добавляем заголовок во время вывода тела!
Header("Content-type: text/plain");
print "I am alive!";
Временный перехват выходного потока
#!/usr/bin/perl -w
use CGI::WebOut;
print "Hello world! ";
# все, что выводится якобы в браузер, попадет в $st
my $st=grab {
print 'Этот текст сразу в браузер не попадет - ';
print 'он будет помещен в переменную $st';
};
print "I am alive! ";
print "Перехваченная строка: '$st'";
Многоуровневый перехват
#!/usr/bin/perl -w
use CGI::WebOut;
my $st=grab {
print "Этот текст сразу в браузер не попадет - ";
# нам все равно, был ли вывод уже перехвачен
my $s=grab {
print 'А вот этот текст не попадет в $st -';
print 'Он будет сохранен в $s';
};
print 'он будет помещен в переменную $st. ';
print "Текст из s: '$s'";
};
# не забудьте только ";" после последней "}"!
print "Перехваченная строка: '$st'";
Работа с исключениями
#!/usr/bin/perl -w
use CGI::WebOut;
# исключение (фатальная ошибка), порожденное
# в блоке try, передается коду в блоке catch.
try {
require No_such_module;
# можно сгенерировать исключение программно
throw "Исключение";
} catch {
# объект-исключение в $_
warn "Не удалось подключить модуль: $_\n";
} warnings {
# ошибки и предупреждения в @_
warn "Во время подключения произошли ошибки ".
"и предупреждения: ".join("\n",@_);
};
# блоки catch и warnings можно опускать:
try {
Do_some_dangerous_work();
};
Ну что, все? Почти. Еще чуть-чуть, потерпите. |
Другие возможности
#!/usr/bin/perl -w
use CGI::WebOut;
# теперь можно выводить заголовки во время вывода тела
NoAutoflush();
# отключаем кэширование в браузере
NoCache();
# или можем перенаправить на другую страницу
Redirect("http://www.perl.org");
exit(); # не забудьте завершить скрипт после редиректа!
# или же немедленно посылаем накопленные заголовки
# и тело документа в браузер, не дожидаясь конца скрипта
Flush();
Ну вот, теперь достаточно. Казалось бы, не так уж и много, но это действительно все, что может когда-либо понадобиться при работе с выходным потоком CGI. Кстати говоря, многих возможностей, которые поддерживаются модулем CGI::WebOut, в PHP просто нет.
У нас остались еще две проблемы, помните?..
![]() |
| ||||||||||||||||||||||||
| Дмитрий Котеров | ©1999-2010 | | Контакт | Вернуться к оглавлению |