2012-05-09 40 views
12

Làm cách nào để chuyển hướng luồng STDOUT tới hai tệp (bản sao) trong tập lệnh Perl của tôi? Hiện tại tôi chỉ đang phát trực tuyến vào một tệp nhật ký duy nhất:Perl: Chuyển hướng STDOUT sang hai tệp

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

Tôi phải thay đổi điều gì? Cám ơn.

Trả lời

10

Bạn cũng có thể sử dụng 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" 

Và vâng, sản lượng hoạt động:

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

OP ở đâu yêu cầu thay thế 'STDOUT' (... và với cái gì? 0_o). OP muốn "chuyển hướng luồng' STDOUT' tới hai tệp ". –

+0

Bằng 'select'ing' $ tee', '$ tee' trở thành xử lý mặc định. TIMTOWTDI, cho dù bạn có thích hay không. –

+0

Tôi thực sự rất mù. Xóa các bình luận sai của tôi! – ikegami

3

Nếu bạn đang sử dụng hệ thống giống Unix, hãy sử dụng tiện ích tee.

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

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

Để thiết lập trùng lặp này từ bên trong chương trình của bạn, thiết lập một đường ống từ STDOUT của bạn đến một bên ngoài quá trình tee. Chuyển số "|-" đến open giúp việc này dễ dàng thực hiện.

#! /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

Hai tệp chỉ (không có màn hình): 'perl ... | tell/tmp/foo>/tmp/bar' – ikegami

+0

Tôi muốn chuyển hướng trong tập lệnh. Hiện tại tôi chỉ có một tệp nhật ký: mở (STDOUT, "> $ out_file") hoặc chết "Không thể mở $ out_file: $! \ N"; Tôi phải thay đổi điều gì? –

+0

@Matze Xem câu trả lời cập nhật. –

4

File::Tee cung cấp các chức năng mà bạn cần.

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

Sử dụng lớp tee PerlIO.

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 
Các vấn đề liên quan