2009-10-07 17 views
7

मैं पर्ल के साथ एक चर के लिए कैसे मुद्रित कर सकता हूं?पर्ल में, फ़ाइल के बजाय मैं एक चर के लिए कैसे मुद्रित कर सकता हूं?

मैं जो एक बेहद वर्बोज़ फैशन में अपने पुनरावृत्ति प्रगति लॉग थोड़ी देर के लिए एक कार्यक्रम पर काम कर रहा है ...

print $loghandle $some_message; 

हालांकि, मैं भी चुनिंदा के कुछ प्रिंट करना चाहते हैं एक अलग फ़ाइल के लिए संदेश। स्वाभाविक रूप से, मैं कोड को छिड़का सकता हूं ...

print $loghandle $some_message 
print $otherloghandle $some_message 

या पूरे व्यवसाय को एक समारोह में फिर से लिखना। ब्ला।

मुझे क्या करना चाहते हैं जब मैं $ loghandle खोलने इतनी है कि जब मैं print 'ing, मैं वास्तव में सिर्फ एक चर के खिलाफ एक sprintf ish आपरेशन कर रहा हूँ कर रहा हूँ (यह $current_iteration कहते हैं) कुछ जादू करते हैं, ताकि है मैं इस तरह कुछ कर सकते हैं जब मैं एक निर्णय बात करने के लिए नीचे लाने के लिए ...

print $real_log_file $current_iteration; 
print $other_real_log_file $current_iteration if($condition); 

मैं काफी यकीन है कि मैं इस कहीं की तरह कुछ देखा है हूँ, लेकिन मुझे नहीं पता कि यह वह जगह है जहाँ या जहां देखने के लिए है ।

संपादित करें: फ़ाइल :: टी इस समस्या को * निक्स पर कुछ हद तक हल करता है, लेकिन मैं विंडोज पर चलता हूं।

+2

देजा वू? http://stackoverflow.com/questions/1532544/how-can-i-send-stdout-and-stderr-to-a-log-file-and-to-the-screen-in-win32-perl/1532691# संभवतः 1532691 –

+0

। मैं वास्तव में वास्तविक धाराओं को टी करने की कोशिश नहीं कर रहा हूं (हालांकि इससे कोई फर्क नहीं पड़ता); यह गंतव्य स्ट्रीम के रूप में कार्य करने के लिए एक चर सेट कर रहा है। मैं आलसी हूं और 50 अजीब लॉगिंग संदेशों को फिर से लिखना नहीं चाहता हूं, देखें। :-) –

+2

@ पॉल नाथन मैं ब्रायन डी फोय के जवाब से जुड़ा हुआ हूं। Log4perl का प्रयोग करें। लॉगिंग स्तर के रूप में अपनी '$ शर्त' को व्यक्त करें, क्रियाओं को परिभाषित करें। मैं इसे एक उत्तर के रूप में नहीं जोड़ रहा हूं क्योंकि मेरे पास यह देखने के लिए समय नहीं है कि यह कैसे काम करता है, लेकिन मैं पिछले अनुभव के आधार पर Log4perl की पूरी तरह से अनुशंसा करता हूं। –

उत्तर

18

आप इसे ing open द्वारा एक filehandle के रूप में एक अदिश चर का इलाज कर सकते हैं::

open my $fh, '>', \$variable or die "Can't open variable: $!"; 
print $fh "Treat this filehandle like any other\n"; 

तुम भी एक के लिए stdout या stderr मैप कर सकते हैं

और यहाँ मेरा अनुरोध स्वीकार किटी है स्केलर:

close STDOUT; 
open STDOUT, '>', \$variable or die "Can't open STDOUT: $!"; 

यदि आप डब्ल्यू अपने आउटपुट को विभाजित करने के लिए चींटी या अपने लॉगिंग के साथ "रोचक" चीजें करने के लिए कॉन्फ़िगरेशन फ़ाइल सेट अप करें, आप Log4Perl के साथ बेहतर हैं क्योंकि अन्य ने सुझाव दिया है।

2

आप फ़ाइल आउटपुट को एकाधिक आउटपुट स्ट्रीम में विभाजित करने के लिए File::Tee का उपयोग कर सकते हैं।

use File::Tee; 
open my $fh, '>', 'logfile.txt' or die $!; 
tee($fh, '>', 'otherlogfile.txt') if $condition; 

print $fh $current_iteration; # will also go to otherlogfile.txt 
           # if $condition was true 
+0

मैं विंडोज पर चलाता हूं (फ़ाइल :: टीई नहीं करता है)। सवाल में जोड़ना। –

1

ध्वनि जैसे आप tie अपने फ़ाइल हैंडल करना चाहते हैं।

my $x; 

# printing to $fh will update the variable $x 
# when you close $fh, it will print $x to a filehandle depending 
# on code in the function Print_to_variable::CLOSE 

tie $fh, "Print_to_variable", \$x, $output_fh1, $output_fh2; 
print $fh "stuff"; 
print $fh "more stuff"; 
close $fh; 

sub Print_to_variable::TIEHANDLE { 
    my ($class, $ref, $fh1, $fh2) = @_; 
    my $self = {}; 
    $self->{ref} = $ref; 
    $self->{output_fh1} = $fh1; 
    $self->{output_fh2} = $fh2; 
    bless $self, "Print_to_variable"; 
    $self; 
} 
sub Print_to_variable::PRINT { 
    my ($self,@list); 
    ${$self->{ref}} .= join "", @list; 
} 
sub Print_to_variable::CLOSE { 
    my $self = shift; 
    my $text = ${$self->{ref}}; 
    if (&myCondition1($text)) { # ... how you decide where to print 
     print {$self->{output_fh1}} $text; 
    } else { 
     print {$self->{output_fh1}} $text; 
    } 
} 
+0

मुझे ऐसा लगता है, लेकिन मेरे पास आज गूंगा है और यह नहीं देखता कि वास्तव में टाई वास्तव में कैसे काम करती है। –

2

Perlfaq5 एक से अधिक फ़ाइलों को मुद्रण के लिए Tie::FileHandle::Multiplex सिफारिश की।

स्रोत बहुत आसान है और प्रति-हैंडल फ़िल्टर के साथ संशोधित करना आसान होना चाहिए।

5

क्या आपका मतलब IO::Scalar जैसा है? आपको फ़ाइल वैंडल अर्थशास्त्र के साथ एक चर में लिखने देता है।

+3

आपको स्पष्ट रूप से आईओ :: स्केलर की आवश्यकता नहीं है। खुले() स्वयं ही ठीक काम करता है। –

1

यह जबरदस्त हैक है, और मुझे लगता है कि लॉग 4Perl का सिनान का समाधान मेरे पास समय होने पर जाने का तरीका है।

sub print_to_var($$) { 
    my($rx_var, $scalar) = @_; 
    $$rx_var .= $scalar; 
} 


print_to_var \$logvar, $message; 

#...later on... 
print $somefile $logvar; 

संपादित करें::

के बाद से इस समुदाय विकी है, इसके लायक कुछ भी नहीं है कि पर्ल कार्यों के लिए तर्क उपनाम है

लेकिन, यह क्या मैं एक पूरा होने चीज के रूप में, का उपयोग कर रहा है। इसका मतलब है कि तुम सिर्फ यह लिख सकते हैं:

sub print_to_var($$) { 
    $_[0] .= $_[1]; 
} 

और फिर कहते हैं:

my $foo = "OH HAI. "; 
print_to_var $foo, "I ARE HELO KITTIE."; 
say $foo; # OH HAI. I ARE HELO KITTIE. 

यह एक विशेष रूप से जबरदस्त हैक, हालांकि print_to_var एक बहुत अधिक टाइपिंग . है की तुलना में है नहीं है।

helo kittie http://blogs.philadelphiaweekly.com/style/files/2008/11/hello-kitty-color.gif

+0

मैं खुश हूँ! और मैं कार्यों को अलियासिंग/रेफरेंसिंग तर्कों के बारे में निश्चित नहीं था। धन्यवाद! –

4

यदि आप चुनिंदा लॉगिंग करना चाहते हैं, जहां आप नियंत्रित कर सकते हैं कि कौन से संदेश लॉग हैं और जहां वे लॉग हैं, Log::Log4perl का उपयोग करें। इससे आपको tie एस और अन्य ब्लैक जादू के साथ गड़बड़ी के समय का एक गुच्छा बचाएगा।

संबंधित मुद्दे

 संबंधित मुद्दे