2012-05-09 14 views

Respuesta

10

También puede utilizar IO::Tee.

use strict; 
use warnings; 
use IO::Tee; 

open(my $fh1,">","tee1") or die $!; 
open(my $fh2,">","tee2") or die $!; 

my $tee=IO::Tee->new($fh1,$fh2); 

select $tee; #This makes $tee the default handle. 

print "Hey!\n"; #Because of the select, you don't have to do print $tee "Hey!\n" 

Y sí, la salida de obras:

> cat tee1 
Hey! 
> cat tee2 
Hey! 
+0

¿Dónde pidió el OP que reemplace 'STDOUT' (... y con qué? 0_o). OP quería "redirigir la secuencia' STDOUT' a dos archivos ". –

+0

Al seleccionar 'ing '$ tee',' $ tee' se convierte en el manejador predeterminado. TIMTOWTDI, te guste o no. –

+0

Estoy realmente ciego. ¡Borrando mis comentarios falsos compeltes! – ikegami

3

Si está utilizando un sistema similar a Unix, utilice la utilidad tee.

$ perl -le 'print "Hello, world"' | tee /tmp/foo /tmp/bar 
Hello, world 

$ cat /tmp/foo /tmp/bar 
Hello, world 
Hello, world

Para configurar esta duplicación desde el programa, configurar una tubería de su STDOUT a un proceso externo camiseta. Pasando a "|-"open lo hace fácil de hacer.

#! /usr/bin/env perl 

use strict; 
use warnings; 

my @copies = qw(/tmp/foo /tmp/bar); 

open STDOUT, "|-", "tee", @copies or die "$0: tee failed: $!"; 

print "Hello, world!\n"; 

close STDOUT or warn "$0: close: $!"; 

Demostración:

$ ./stdout-copies-demo 
Hello, world! 

$ cat /tmp/foo /tmp/bar 
Hello, world! 
Hello, world!
+0

Dos archivos solamente (sin pantalla): 'perl ... | tell/tmp/foo>/tmp/bar' – ikegami

+0

Quiero redirigir dentro del script. Actualmente estoy sólo tener un archivo de registro: abierta (STDOUT, "> $ out_file") or die "No se puede abrir $ out_file: $! \ N"; ¿Qué tengo que cambiar? –

+0

@Matze Ver respuesta actualizada. –

4

File::Tee proporciona la funcionalidad que necesita.

use File::Tee qw(tee); 
tee(STDOUT, '>', 'stdout.txt'); 
4

Utilice la capa PerlIO tee.

use PerlIO::Util; 
*STDOUT->push_layer(tee => "/tmp/bar"); 
print "data\n"; 

$ perl tee_script.pl > /tmp/foo 
$ cat /tmp/foo 
data 
$ cat /tmp/bar 
data 
Cuestiones relacionadas