2012-05-09 17 views
12

मैं अपनी पर्ल स्क्रिप्ट के भीतर STDOUT स्ट्रीम को दो फ़ाइलों (डुप्लिकेट) पर रीडायरेक्ट कैसे कर सकता हूं? वर्तमान में मैं सिर्फ एक लॉग फ़ाइल में स्ट्रीमिंग कर रहा हूं:पर्ल: दो फ़ाइलों को STDOUT को रीडायरेक्ट करें

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

मुझे क्या बदलना है? धन्यवाद।

उत्तर

10

तुम भी 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" 

और हाँ, उत्पादन काम करता है:

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

ओपी ने 'STDOUT' (... और किसके साथ? 0_o) को बदलने के लिए कहा था। ओपी चाहता था कि "STDOUT' स्ट्रीम को दो फाइलों पर रीडायरेक्ट करें"। –

+0

'$ tee'' चुनकर, '$ tee 'डिफ़ॉल्ट हैंडल बन जाता है। TIMTOWTDI, चाहे आप इसे पसंद करते हैं या नहीं। –

+0

मैं वास्तव में वास्तव में अंधा हूं। मेरी मजबूती झूठी टिप्पणियों को हटा रहा है! – ikegami

3

यदि आप यूनिक्स जैसी प्रणाली का उपयोग कर रहे हैं, तो tee उपयोगिता का उपयोग करें।

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

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

अपने कार्यक्रम के भीतर से इस दोहराव सेट करने के लिए, एक बाहरी टी प्रक्रिया करने के लिए अपने STDOUT से एक पाइप की स्थापना की। "|-" से open पास करना आसान बनाता है।

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

डेमो:

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

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

केवल दो फाइलें (कोई स्क्रीन नहीं): 'perl ... | बताएं/tmp/foo>/tmp/bar' – ikegami

+0

मैं स्क्रिप्ट के भीतर रीडायरेक्ट करना चाहता हूं। वर्तमान में मेरे पास सिर्फ एक लॉग फ़ाइल है: खुला (STDOUT, "> $ out_file") या मरें "$ out_file नहीं खोल सकता: $! \ N"; मुझे क्या बदलना है? –

+0

@Matze अद्यतन उत्तर देखें। –

4

File::Tee कार्यक्षमता की जरूरत है प्रदान करता है।

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

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 
संबंधित मुद्दे