2009-02-06 6 views
9

मैं इस संभावना को संभालने की कोशिश कर रहा हूं कि कोई तर्क नहीं है और कोई पर्ल स्क्रिप्ट को कोई पर्ल स्क्रिप्ट पास नहीं किया जाता है। मुझे लगता है कि अगर कोई तर्क नहीं है तो एसटीडीआईएन के माध्यम से इनपुट पाइप किया जा रहा है। हालांकि यदि उपयोगकर्ता कोई तर्क नहीं देता है और स्क्रिप्ट पर कुछ भी पाइप नहीं करता है, तो यह कीबोर्ड इनपुट प्राप्त करने का प्रयास करेगा। मेरा उद्देश्य इसके बजाय एक त्रुटि संदेश प्रदान करना है।मैं चयन के बिना पर्ल में पाइप डेटा के लिए STDIN कैसे देख सकता हूं?

दुर्भाग्यवश, select() कुछ गैर-पॉज़िक्स सिस्टम के लिए पोर्टेबल नहीं है। अधिकतम पोर्टेबिलिटी के साथ ऐसा करने का कोई और तरीका है?

उत्तर

19

पर्ल -t फ़ाइल परीक्षण ऑपरेटर, जो आपको बताता है कि एक विशेष filehandle एक TTY के लिए खुला है के साथ आता है। इसलिए, जब आप यह करने के लिए सक्षम होना चाहिए:

if (-t STDIN and not @ARGV) { 
    # We're talking to a terminal, but have no command line arguments. 
    # Complain loudly. 
} 
else { 
    # We're either reading from a file or pipe, or we have arguments in 
    # @ARGV to process. 
} 

एक त्वरित परीक्षण पर्ल 5.10.0 और लिनक्स के साथ पर्ल 5.8.8 के साथ, तो यह सबसे आम पर्ल भर में पोर्टेबल होना चाहिए विंडोज पर यह काम कर ठीक से पता चलता है वातावरण।

जैसा कि अन्य ने उल्लेख किया है, select एक विश्वसनीय विकल्प नहीं होगा क्योंकि आप एक प्रक्रिया से पढ़ रहे समय हो सकते हैं, लेकिन उस प्रक्रिया ने अभी तक लिखना शुरू नहीं किया है।

शुभकामनाएँ

,

पॉल

+0

मैक ओएस एक्स +5 पर काम करने की पुष्टि अगर मैं कर सकता था, लेकिन मैं नहीं कर सकता, तो +1। –

5
use POSIX 'isatty'; 
if (! @ARGV && isatty(*STDIN)) { 
    die "usage: ..."; 
} 

देखें: http://www.opengroup.org/onlinepubs/009695399/functions/isatty.html

नोट का चयन है कि वैसे भी ज्यादा मदद नहीं होगा, क्योंकि यह गलत परिणाम होगा अगर पाइप की जानकारी अभी तक तैयार नहीं था। उदाहरण:

seq 100000|grep 99999|perl -we'$rin="";vec($rin,fileno(STDIN),1)=1;print 0+select($rin,"","",.01)' 
+0

इस से 'का चयन करें()', आप POSIX भी प्रयोग कर रहे हैं बेहतर नहीं है। ओपी ने विशेष रूप से कहा: * दुर्भाग्यवश, चुनें() कुछ गैर-पॉज़िक्स सिस्टम के लिए पोर्टेबल नहीं है। * – nyuszika7h

+0

मैं समझा रहा हूं कि गैर-पॉज़िक्स पोर्टेबिलिटी चिंता का विषय नहीं है, तो चयन से बेहतर क्या होगा। – ysth

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

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