¿Cómo puedo cambiar el gestor de archivo de salida estándar para una llamada al sistema en Perl?

StackOverflow https://stackoverflow.com/questions/990913

  •  13-09-2019
  •  | 
  •  

Pregunta

Estoy intentando cambiar la salida estándar de la función del sistema mediante selección. Pero no parece estar funcionando. La salida del sistema se está representada en la consola en lugar de obtener redirigida al archivo.

use strict;
use warnings;

chdir "C:\\Documents and Settings\\" or die "cannot open the dir\n";
open FH, ">out.txt" or die "cannot open out.txt\n";
select FH or die " cannot change the stdout\n";
system "dir /a" ; 

A pesar de que pueda hacer system "dir /a > out.txt", quiero saber por qué el código anterior no funciona.

¿Fue útil?

Solución

La función select cambia el gestor de archivo predeterminado de la salida. No cambia la salida estándar, lo que apunta a lo que apunta a importar si es el gestor de archivo predeterminado de la salida. Si desea cambiar la salida estándar, lo que tiene que hacer algo como ylebre o la respuesta de Jon.

Cuando se inicia un proceso hijo, que tiene la misma salida estándar como el padre. No importa lo que el gestor de archivo por defecto de los padres es sin embargo.

Otros consejos

El problema con el código de comando es que system no captura la salida para usted. Puede utilizar qx//:

use strict;
use warnings;

open my $fh, ">", "output.txt" or die $!;
my $oldfh= select $fh;
print qx/ls -a/;
select $oldfh;
close $fh or warn $!;

Hay otras opciones para ejecutar una aplicación externa y obtener leer su salida, al igual que los módulos IPC::Open2 y IPC::Open3. Están incluidos en Perl por defecto.

Una nota al margen: no utilizar globos de identificadores de archivo: son globales y variables globales son malas. Utilizar variables léxicas lugar (FH vs $fh). También, se debe utilizar el argumento open tres en lugar de dos parámetros, ya que el primero es más seguro que el segundo.

este ayuda

No estoy seguro 'selecciona' es lo que se busca en este caso. Para redirigir la salida estándar a un archivo, puede hacer lo siguiente:

use strict;
use warnings;
use IO::Handle;
open FH, "> out.txt";
STDOUT->fdopen( \*FH, 'w' ) or die $!;
print "Hello world!\n";
system "dir /a";

Espero que esto ayude!

Me vuelva a asignar los descriptores de fichero en el sistema (no Perl) Nivel:

    sub reopen($$$) {
        open $_[0], $_[1]. '&='. fileno($_[2]) or die "failed to reopen: $!";
    }

    reopen *STDOUT,  '>', $new_stdout_handle;

Ahora todo lo que usted va a pensar tenedor $ new_stdout_handle es la salida estándar.

Pegué un ejemplo completo a lo esencial: http://gist.github.com/129407

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top