Llamo a una función que escribe en STDOUT utilizando impresión. ¿Cómo puedo capturar esto en una variable?¿Cómo capturo el STDOUT de Perl en una variable?
Tenga en cuenta que todo esto sucede dentro del mismo proceso.
Llamo a una función que escribe en STDOUT utilizando impresión. ¿Cómo puedo capturar esto en una variable?¿Cómo capturo el STDOUT de Perl en una variable?
Tenga en cuenta que todo esto sucede dentro del mismo proceso.
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).
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.
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
Bueno, no hasta que alguien presente un parche. [RT # 60515] (https://rt.cpan.org/Ticket/Display.html?id=60515) :) –
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. –