2012-05-07 12 views
9

कभी-कभी मुझे "STDOUT" शब्द का उपयोग करना पड़ता है, कभी-कभी बेवकूफ काम नहीं करता है और कभी-कभी मैं शब्दकोष या किसी अन्य रूप का उपयोग कर सकता हूं। क्या नियम हैं, जो मुझे बताते हैं कि मुझे फॉर्म पर कब चयन करना है और जब कोई और जब मैं फॉर्म चुन सकता हूं?क्या ऐसे नियम हैं जो मुझे बताते हैं कि STDOUT/STDERR/SDTIN मुझे किस प्रकार का चयन करना है?

#!/usr/bin/env perl 
use warnings; 
use 5.12.0; 
use utf8; 


print STDOUT "Something\n";    # works 

print \*STDOUT "Something\n";   # String found where operator expected 

print { STDOUT } "Something\n";   # Bareword "STDOUT" not allowed while "strict subs" in use 

print { \*STDOUT } "Something\n"  # works 


my $fh; 

$fh = -t STDOUT ? STDOUT : STDERR;  # Bareword "STDOUT"/"STDERR" not allowed while "strict subs" in use 

$fh = -t STDOUT ? \*STDOUT : \*STDERR; # works 

$fh = -t \*STDOUT ? \*STDOUT : \*STDERR; # works 

उत्तर

12

ये मेरी परीक्षण के अनुसार नियम हैं:

  1. जब use strict subs प्रभाव में है, bareword संस्करणों filehandles के रूप में पारित नहीं किया जा सकता, शायद क्योंकि वे सबरूटीन कॉल हो सकता है।

  2. *STDOUT और \*STDOUT संस्करणों का उपयोग हर समय कार्यों को पारित करने के लिए किया जा सकता है।

  3. उनमें से एक को foo STDOUT (बिना ब्रांड्स के) ब्रेक के साथ एक उप में पास करना क्योंकि पेर्ल मानता है कि STDOUT->foo है।

  4. मामलों 1 और 3 के अलावा, आप उन्हें शब्दकोष के साथ भी सब्सक्राइब करने के लिए पास कर सकते हैं।

  5. print, printf आदि पर कॉल के लिए, आपको या तो शब्दकोष संस्करणों का उपयोग करना होगा, या {} का उपयोग करना होगा। {} में फ़ाइल हैंडल को संलग्न करना पर्ल बताता है कि हां पहला तर्क एक फ़ाइल हैंडल है, इसलिए आप किसी भी फॉर्म का उपयोग कर सकते हैं।

इन उद्देश्यों के लिए एक उप के रूप में -t गिनती के लिए, के रूप में अन्य -X परीक्षण है कि filehandles स्वीकार करते हैं।

जब आप print या printf साथ {} उपयोग करते हैं, {} अंदर भाग एक कोड ब्लॉक है, इसका मूल्यांकन किया जाता है और परिणाम फ़ाइलहेडल के रूप में उपयोग किया जाता है। यह उन कार्यों के साथ काम करता है क्योंकि उन्हें विशेष रूप से पेर्ल द्वारा माना जाता है, उसी तरह map और grep। bareword संस्करण

  • जब explcitly stderr या stdout मुद्रण, का उपयोग करें::

    तो इन नियमों का पालन और आप ठीक हो जाएगा

    print STDERR "ERRORRRRR\n"; 
    
  • जब किसी अन्य तरीके से एक filehandle का उपयोग कर

    my $isterm = -t *STDOUT; 
    close(*STDERR); 
    
:, * संस्करण का उपयोग

मैंने अभी तक 5.8.7 के रूप में परीक्षण किया है। यह अभी तक वापस है क्योंकि मैं अभी जा सकता हूं। उपरोक्त को 5.6 के लिए भी काम करना चाहिए।

+0

और कैसे 'प्रिंट {\ * STDOUT} "कुछ \ n";' (लेखक कहता है कि यह काम करता है) और आपका 5 वां नियम? – ArtM

+0

काफी सही। मुझे * क्यों * काम करता है की जांच करें। –

+0

perldoc.perl.org कहता है * FILEHANDLE एक स्केलर वैरिएबल हो सकता है जिसमें फ़ाइल नाम का नाम या संदर्भ शामिल है, इस प्रकार 'प्रिंट' के लिए एक स्तर का संकेत। * अंत में * ब्लॉक * केस भी वर्णित है। – ArtM

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