2012-05-09 33 views
12

Jak mogę przekierować strumień STDOUT do dwóch plików (duplikatów) w moim skrypcie Perla? Aktualnie przesyłam tylko jeden plik dziennika:Perl: Przekieruj STDOUT do dwóch plików

open(STDOUT, ">$out_file") or die "Can't open $out_file: $!\n"; 

Co muszę zmienić? Dzięki.

Odpowiedz

10

Można również użyć 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" 

I tak, wyjście działa:

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

Gdzie OP poprosił o zastąpienie 'STDOUT' (... i czym? 0_o). OP chciał "przekierować strumień' STDOUT' na dwa pliki ". –

+0

Poprzez 'select'ing' $ tee', '$ tee' staje się domyślnym uchwytem. TIMTOWTDI, czy ci się to podoba, czy nie. –

+0

Naprawdę jestem naprawdę ślepy. Usuwanie moich fałszywych komentarzy! – ikegami

3

Jeśli używasz systemu uniksowego, użyj narzędzia tee.

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

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

Aby skonfigurować tę powielania z poziomu programu, założyć rurkę z STDOUT do zewnętrznego tee procesu. Przekazywanie "|-" do open ułatwia to zadanie.

#! /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: $!"; 

Demo:

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

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

Tylko dwa pliki (bez ekranu): 'perl ... | tell/tmp/foo>/tmp/bar' – ikegami

+0

Chcę przekierować w skrypcie. Obecnie mam tylko jeden plik dziennika: open (STDOUT, "> $ out_file") lub umrzeć "Nie można otworzyć $ plik_wdalny: $! \ N"; Co muszę zmienić? –

+0

@Matze Zobacz zaktualizowaną odpowiedź. –

4

File::Tee zapewnia funkcjonalność, której potrzebujesz.

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

Użyj warstwy 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 
Powiązane problemy