2011-08-14 8 views
5

मैं ऐसे प्रोग्राम में काम कर रहा हूं जहां उपयोगकर्ता -o file विकल्प पास कर सकता है, और आउटपुट को तब उस फ़ाइल पर निर्देशित किया जाना चाहिए। अन्यथा, यह stdout पर जाना चाहिए।ओपन फाइलहेडल या असाइन करें stdout

विकल्प पुनर्प्राप्त करने के लिए मैं मॉड्यूल getopt का उपयोग कर रहा हूँ, और यह समस्या नहीं है। समस्या यह है कि मैं उस फ़ाइल या के साथ फ़ाइल हैंडल बनाना चाहता हूं, यदि विकल्प सेट नहीं किया गया था तो उसे stdout असाइन करें।

if ($opt) { 
    open OUTPUT, ">", $file; 
} else { 
    open OUTPUT, # ??? 
} 

है ऐसा इसलिए है क्योंकि इस तरह से, बाद में मेरे कोड में मैं सिर्फ कर सकते हैं:

print OUTPUT "..."; 

चिंता करता है, तो OUTPUT stdout एक फ़ाइल उपयोगकर्ता द्वारा निर्दिष्ट है या बिना। क्या यह संभव है? अगर मैं यहां एक खराब डिजाइन कर रहा हूं, तो कृपया मुझे बताएं।

+0

संबंधित: http://stackoverflow.com/q/6296536#6296773 – daxim

उत्तर

7

यह कैसे select का उपयोग करने पर एक अच्छा उदाहरण होगा।

use strict; 
use warnings; 
use autodie; 

my $fh; 
if ($opt) { 
    open $fh, '>', $file; 
    select $fh; 
} 

print "This goes to the file if $opt is defined, otherwise to STDOUT." 
+1

नाइस टीएलपी, बहुत बहुत धन्यवाद। पर्ल के बारे में जानने के लिए अभी भी कई चीजें हैं ... हालांकि, मुझे यकीन नहीं है कि यह 'जबकि (<>)' के अंदर काम करेगा, यह मेरा मामला नहीं है बल्कि इसके बारे में सोच रहा है। इन मामलों में stdout को फिर से खोलना एक बेहतर विकल्प प्रतीत होता है, क्योंकि मुझे प्रिंट को लेबल करना होगा। – cmre

+0

@cmre ओह, आपने अपनी टिप्पणी संपादित की। खैर, यह बस स्टडीओटीटी को फिर से खोलने के साथ-साथ काम करेगा। 'प्रिंट STDOUT "foo" 'अनिवार्य रूप से' प्रिंट" foo '' जैसा ही है, इसलिए आपको फ़ाइल हैंडल निर्दिष्ट करने की आवश्यकता नहीं है। मुझे पूरा यकीन नहीं है कि आपकी चिंता क्या है, लेकिन आपको उस समाधान का उपयोग करना चाहिए जिसके साथ आप सहज महसूस करते हैं। – TLP

+0

हाँ, बस इसे संपादित करें, क्षमा करें। चिंता यह है कि 'प्रिंट' कुछ ''' के अंदर '(<>) {...}' इसे चयनित फ़ाइल में आउटपुट करेगा, है ना? या शायद नहीं, मैं बस पर्ल से शुरुआत कर रहा हूं और अब यह वास्तव में भ्रमित हो रहा है: पी – cmre

4

open दस्तावेज़ीकरण को देखें। STDOUT स्वयं को फिर से खोलना सबसे आसान है और अपने कोड में फ़ाइलहेडल का उपयोग नहीं करना है।

if ($opt) { 
    open(STDOUT, ">", $file); 
} 
... 

print "this goes to $file or STDOUT\n"; 

(निश्चित रूप से जाँच कुछ त्रुटि जोड़ें।)

+0

धन्यवाद मैट, बहुत आसान है। – cmre

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