Perl не может перевести STDOUT в Binmode после развязки дескриптора файла

Мне нужно отключить прогрессивную буферизацию ответа HTTP.

У меня это работает в Perl, используя класс дескриптора файла:

$|=1;
$TIE = tie(*STDOUT,__PACKAGE__);

Операторы печати хранятся в массиве и извлекаются с помощью следующего:

$buffer = tied *STDOUT;
$buffer = join('', @$buffer);
undef $TIE;
untie(*STDOUT);

Если ответ HTTP — text/html, он правильно отображается в браузере.

Однако для бинарных потоков я не могу установить binmode на STDOUT после того, как он отвязан, и содержимое повреждено.

Если я сохраняю ответ HTTP в файл или не использую класс дескриптора файла, двоичные данные сохраняются.

Любые предложения о том, как заставить необработанное кодирование? Спасибо.


person xpsd300    schedule 01.06.2012    source источник


Ответы (1)


Что-то вроде этой работы?

use strict;
use warnings;
use IO::Handle;

my $io = IO::Handle->new;
my $fh = $io->fdopen(fileno(STDOUT),"w");
$fh->autoflush(1);

my $TIE = tie( $fh ,__PACKAGE__);

sub TIESCALAR { };

binmode($fh);

print $fh "Foo";
person Evan Carroll    schedule 01.06.2012
comment
Спасибо, Эван. Я сузил его до моего метода кодирования передачи по частям, который использует unpack с шаблоном a. Кажется, это переопределяет binmode. - person xpsd300; 01.06.2012