2009-11-21 10 views
9

मैं उत्सुक हूं अगर मैं कुछ मूल्य या इनलाइन अभिव्यक्ति (बिना किसी कथन का उपयोग किए) के आधार पर प्रिंटिंग के बीच STDOUT या STDERR के बीच टॉगल कर सकता हूं।मैं पर्ल में गतिशील रूप से STDOUT/STDERR को प्रिंटिंग कैसे टॉगल करूं?

print ($someFlag ? STDOUT : STDERR) "hello world!" 

जाहिर है, यह वाक्यविन्यास काम नहीं करता है।

उत्तर

14

मुझे लगता है कि यह तुम क्या चाहते हो जाएगा:

print {$someFlag ? *STDOUT : *STDERR} "hello world!"; 

ऐसा ही एक उदाहरण print के लिए दस्तावेज में देखा जा सकता है। typeglobs का उपयोग करें ताकि यह use strict के तहत चलाएगा।

एक और रणनीति $someFlag के मूल्य के आधार पर अलग-अलग व्यवहार करने वाले अपने स्वयं के प्रिंटिंग फ़ंक्शन को परिभाषित करना है।

6

क्या आपको प्रत्येक कॉल के लिए print पर मूल्यांकन करने की आवश्यकता है?

यदि नहीं, तो आप के लिए यह काम होगा:

my $redir = $someFlag ? STDOUT : STDERR; 
print $redir "hello world!\n"; 
+0

मैं इसे ले जाऊंगा। मेरे पास प्रिंट करने के लिए केवल एक कॉल है, लेकिन इसे करने के लिए 2 लाइनें ठीक हैं। बस सोचा कि यह अच्छा इनलाइन होगा ... –

4

एक विधि के बारे उत्पादन वर्णनकर्ता (फ़ाइल चैनल) 'का चयन करें' के लिए है।

select STDERR; 
print ...goes to STDERR...; 
select STDOUT; 
print ...goes to STDOUT...; 

मुझे संदेह है कि यह अब बहिष्कृत है, हालांकि।

+0

नहीं, बहिष्कृत नहीं किया गया; यह क्यों होगा? – ysth

+0

@ysth आप इसे क्यों हटा देंगे? क्योंकि इसका वैश्विक साइड इफेक्ट जो "प्रिंट $ स्ट्रिंग == प्रिंट STDOUT $ स्ट्रिंग" के सुविधाजनक शॉर्टेंड को अविश्वसनीय बनाता है। और यह दो अलग-अलग अर्थों के साथ चयन() फ़ंक्शन को अधिभारित करता है। – Schwern

3

मैं एक विधि है कि उचित filehandle रिटर्न में बात की इस तरह लपेट:

print { $obj->which_handle_do_I_want } "Some message"; 

आप कैसे IO::Interactive को देखने के लिए चाहते हो सकता है।

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

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