2010-08-18 10 views

Respuesta

11

Si el código en cuestión no está utilizando la salida estándar de forma explícita (es decir, simplemente no print "..."), se puede utilizar select para cambiar el gestor de archivo que print utiliza:

my $output; 
open(my $outputFH, '>', \$output) or die; # This shouldn't fail 
my $oldFH = select $outputFH; 
call_code_that_prints(); 
select $oldFH; 
close $outputFH; 

print $output; # Here's what we collected 

Usando select hace que sea más fácil para restaurar STDOUT después. Cerrar y volver a abrir STDOUT es más difícil de deshacer. Tenga en cuenta que select no afecta a STDOUT en sí, por lo que no afecta a los procesos externos, pero usted dijo que no tenía ninguno. Tampoco afecta el código que hace algo como print STDOUT "...".

Si el método select no es suficiente para sus necesidades, le recomiendo que pruebe Capture::Tiny. Puede capturar resultados de programas externos y códigos que escriben en STDOUT explícitamente. Pero no puede (actualmente) capturar solo STDOUT; siempre captura STDOUT y STDERR (ya sea por separado o fusionados en una sola cadena).

16

La nueva y genial forma de manejar esto es con Capture::Tiny. Puede usarlo quirúrgicamente para afectar solo la parte del programa donde lo necesita sin alterar nada más. Pero, probablemente haría lo que cjm recommends ya que no requiere un módulo.

+1

Un problema con el uso de Capture :: Tiny para esto es que no tiene forma de capturar solo STDOUT y dejar solo STDERR. Siempre captura ambos, ya sea por separado o fusionados. – cjm

+1

Bueno, no hasta que alguien presente un parche. [RT # 60515] (https://rt.cpan.org/Ticket/Display.html?id=60515) :) –

+0

Seguimiento ... Capture :: Tiny se actualizó en algún momento después de los comentarios anteriores. Puede tomar solo STDOUT y dejar STDERR solo con 'capture_stdout'. También existen otras variantes según lo que desee hacer. Módulo muy útil. –

Cuestiones relacionadas