Perl: получение дескриптора stdin для использования в скрипте cgi-bin - PullRequest
0 голосов
/ 17 июня 2010

Используя perl 5.8.8 на сервере Windows, я пишу скрипт perl cgi, используя Archive :: Zip with, чтобы создать на лету zip, который должен быть загружен пользователями: никаких проблем на этой стороне.Zip управляется в памяти, физический файл не записывается на диск с использованием временных файлов или чего-либо еще.Мне интересно, как разрешить загрузку zip, записывая поток в браузер.То, что я сделал, выглядит примерно так:

binmode (STDOUT);
$zip->writeToFileHandle(*STDOUT, 0);

, но я чувствую себя неуверенно в этом способе получить STDOUT в качестве дескриптора файла.Это правильно и надежно?Существует лучший способ?

Большое спасибо за советы

Ответы [ 2 ]

5 голосов
/ 17 июня 2010

То, что вы делаете, выглядит отлично!

3 голосов
/ 17 июня 2010

Это хороший шанс продемонстрировать достоинство Нетерпения .

Программистам нравится выделять повторения константных литералов и помещать их в контейнеры постоянного типа.(Но я просто буду использовать здесь переменную, чтобы не отвлекать внимание от важной части.)

use IO::File qw();
my $handle = bless(\*STDOUT => 'IO::File')
    or die $OS_ERROR;
# Why not just `$handle = STDOUT`? Code above is necessary
# because using bare STDOUT invokes on IO::Handle only
# which does not have the binmode method.
⋮
$handle->binmode(1);
$handle->print('something');

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

my $handle = IO::File->new('/var/log/cgi', 'a')
    or die $OS_ERROR;
# method calls on $handle stay the same as before
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...