Perl: получение дескриптора для stdin для использования в скрипте cgi-bin
Используя Perl 5.8.8 на сервере Windows, я пишу сценарий Perl CGI, используя Archive::Zip with для создания на лету ZIP, который должен быть загружен пользователями: никаких проблем на этой стороне. Zip управляется в памяти, физический файл не записывается на диск с использованием временных файлов или чего-либо еще. Мне интересно, как разрешить загрузку zip, записывая поток в браузер. Что я сделал, это что-то вроде:
binmode (STDOUT);
$zip->writeToFileHandle(*STDOUT, 0);
но я чувствую себя неуверенно по этому поводу, чтобы получить STDOUT как дескриптор файла. Это правильно и надежно? Существует лучший способ?
Большое спасибо за ваши советы
2 ответа
Это хороший шанс продемонстрировать силу нетерпения.
Программисты любят выделять повторения константных литералов и помещать их в контейнеры константного типа. (Но я просто буду использовать здесь переменную, чтобы не отвлекать внимание от важной части.)
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