Tenho um programa muito grande que grava muitas coisas em STDOUT
, e gostaria de poder enviar toda essa saída para STDOUT
e para um FILE
. Decidi usar IO::Tee
para criar o identificador gravável compartilhado:
use IO::Tee;
pipe(my $reader, my $writer);
my $new_stdout = IO::Tee->new(\*STDOUT, $writer);
*{STDOUT} = $new_stdout;
print "foo";
print(do { local $\; <$reader> });
No entanto, isso causa uma recursão profunda e trava o programa. Então, em vez disso, não consigo referenciar *STDOUT
, e ele cria:
use IO::Tee;
pipe(my $reader, my $writer);
my $new_stdout = IO::Tee->new(*STDOUT, $writer);
*{STDOUT} = $new_stdout;
print "foo";
print(do { local $\; <$reader> });
Isso cria o aviso: Undefined value assigned to typeglob at ... line 42
, e quando eu uso Data::Printer
para descrever $new_stdout
, é undef
. Como posso fazer isso?
Substituir
com
Mas você tem uma série de outros problemas.
$new_stdout->autoflush;
).Demonstração:
Você também pode duplicar CHILD_STDIN em STDERR, se desejar.
Você pode salvar e restaurar o STDOUT original da seguinte maneira: