Perl буферизованный вывод - PullRequest
       5

Perl буферизованный вывод

2 голосов
/ 07 сентября 2011

Я изменяю некоторые сценарии Perl в существующем решении. Из-за некоторых изменений при обновлении (Windows) сервера я переключил их с работы ISAPI на CGI. Это означает, что теперь мне нужно отправить Content-Type вручную, иначе произойдет сбой.

Так что мне нужно включить буферизацию вывода (операторы печати, то есть STDOUT), отправить Content-Type: text / html, но в случаях, когда это перенаправление, мне нужно очистить буфер вывода и отправить новый заголовок.

Как мне это сделать?

Или есть другой способ? Обратите внимание, что скрипт уже использует print для вывода HTML, и я не могу это изменить. (Это было написано в начале 90-х годов.)

select(STDOUT);
$| = 0;
print "Content-Type: text/html\n\n";
# somehow clear output
print "Location: login.pl\n\n";

Ответы [ 3 ]

6 голосов
/ 07 сентября 2011

Вы не можете "отменить" print до STDOUT. Вам нужно решить, генерируете ли вы вывод HTML или перенаправление до того, как отправите что-либо в STDOUT.

Один из способов сделать это - select буфер в памяти вместо STDOUT:

my $buffer = '';
open(my $out, '>', \$buffer) or die;
select($out);
print "Content-Type: text/html\n\n";

if (generate_redirect) {
  print STDOUT "Location: login.pl\n\n";
} else {
  print STDOUT $buffer;
}

Как только вы убедитесь, что не будете генерировать перенаправление, вы можете повторно select STDOUT и вывести буфер:

select STDOUT;
print $buffer;
print "<p>HTML now goes to client instead of \$buffer</p>\n";
1 голос
/ 07 сентября 2011

Один из самых безопасных (IMO) способов сделать это - поместить всю логику, необходимую вам, чтобы решить, хотите ли вы перенаправить или нет, вверху вашего скрипта, за до вы выводите что-нибудь еще.

Если вы вообще не хотите изменять исходный сценарий, напишите отдельный сценарий, который просто выполняет логику перенаправления / типа содержимого и впоследствии вызывает ваш оригинальный сценарий, если / когда это необходимо.

0 голосов
/ 07 сентября 2011

Один из ответов, который не был рассмотрен, - это просто заменить дескриптор по умолчанию STDOUT на другой дескриптор в BEGIN, а затем обработать его в END, добавив Content-Type: text/html\n\n, если заголовок отсутствует.Ужасно, но должно работать ... в теории.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...