2009-04-17 8 views
7

Si tengo esta aplicación Perl:Cómo vaciar la salida en los palos de atrás En Perl?

print `someshellscript.sh`; 

que imprime montón de cosas y tarda mucho tiempo en completarse, ¿cómo se puede imprimir, que la producción en el medio de la ejecución del script de shell?

Parece que Perl solo imprimirá el resultado de someshellscript.sh cuando se complete, ¿hay alguna manera de hacer que la salida quede nivelada en el medio de la ejecución?

Respuesta

16

Lo que es probable que desee hacer es algo como esto:

open(F, "someshellscript.sh|"); 
while (<F>) { 
    print; 
} 
close(F); 

Esto ejecuta someshellscript.sh y abre una tubería que lee su salida. El ciclo while lee cada línea de salida generada por el script y la imprime. Consulte la página de documentación open para obtener más información.

+4

Lo único que agregaría es que generalmente es mejor usar un manejador de archivos léxico: abra mi $ fh, "someshellscript.sh |" o morir $ !; – friedo

+0

¿por qué es eso mejor? –

+3

@Nathan: (1) No puede golpear accidentalmente un identificador de archivo existente en un ámbito contenedor; (2) Un identificador de archivo léxico se cerrará automáticamente cuando desaparezcan todas las referencias al identificador de archivo (generalmente en la salida del alcance). –

3

El problema aquí es que al escaparse con los palos de retroceso guarda su secuencia de comandos en una cadena, que luego imprime. Por esta razón, no habría forma de "limpiar" con la impresión.

Usando el comando system() debe imprimir la salida continua, pero usted no será capaz de capturar la salida:

system "someshellscript.sh"; 
+0

+1. EDITAR: agregué una demostración rápida de system() y borré mi propia respuesta, que de otro modo sería redundante. –

Cuestiones relacionadas