2016-03-21 3 views
14

जब मैं system() पर्ल में कॉल करता हूं, तो आमतौर पर perldocs के अनुसार रिटर्न कोड का निरीक्षण करता हूं। अच्छा, मैंने ऐसा सोचा। अधिकांश समय $rc!=0 मेरे लिए पर्याप्त है। हाल ही में मैंने दो लोगों की मदद की, जिनमें system() कॉल के साथ परेशानी थी जब अपाचे के तहत अपनी .cgi स्क्रिप्ट चलाते थे। मैं की $rc

my $rc = system(...); 

जांच करने के लिए उन्हें निर्देश दिए हैं और उन्हें system() डॉक्स से जुड़ा हुआ। तब मैं करीब देखा और डॉक्स वास्तव में $rc लेकिन $? बजाय के बारे में के बारे में बात नहीं कर रहे हैं और मुझे थोड़ा शर्मिंदा महसूस किया और निम्नलिखित प्रश्न पैदा हुआ:

system(...); 
if ($? == -1) { 
    print "failed to execute: $!\n"; 
} 
elsif ($? & 127) { 
    printf "child died with signal %d, %s coredump\n", 
     ($? & 127), ($? & 128) ? 'with' : 'without'; 
} 
else { 
    printf "child exited with value %d\n", $? >> 8; 
} 

और:

वहाँ के बीच एक अंतर है

my $rc = system(...); 
if ($rc == -1) { 
    print "failed to execute: $!\n"; 
} 
elsif ($rc & 127) { 
    printf "child died with signal %d, %s coredump\n", 
     ($rc & 127), ($rc & 128) ? 'with' : 'without'; 
} 
else { 
    printf "child exited with value %d\n", $rc >> 8; 
} 

या, छोटे के लिए, $rc$? के बराबर system() के लिए है?

मैंने system, wait, और $? के दस्तावेज़ों को देखा लेकिन यह मेरे लिए बिल्कुल स्पष्ट नहीं है। क्या मैंने पिछले 15 वर्षों से $rc का उपयोग कर गलत किया है?

+1

आप परिणाम कैप्चर करते हैं करने के लिए '$ वहाँ' $ का कोई मौका नहीं है rc' 'इससे पहले कि आप करने के लिए चारों ओर पाने के तुम पर बदल रहा है? उस मूल्य का उपयोग कर। – tadman

+0

धन्यवाद @tadman। मैंने स्वीकृत उत्तर पर एक टिप्पणी जोड़ा जो आपकी टिप्पणी पर भी लागू होता है। '$ आरसी' का उपयोग करना मेरे लिए क्लीनर तरीका लगता है। – PerlDuck

उत्तर

10

हां, systemका वापसी मूल्य बराबर $? होना चाहिए।

$? के बाद से

हालांकि नहीं केवलsystem कॉल पर लागू करता है और $? एक वैश्विक चर रहा है, यह अन्य कार्यों कि घटित हो रहा द्वारा ओवरराइट किया जा सकता है। perldoc -v '$?' से इन में शामिल हैं:

$ CHILD_ERROR

$?

अंतिम पाइप बंद, बैकटिक ("` `") कमांड, "प्रतीक्षा()" या "प्रतीक्षापिप()" या "सिस्टम()" ऑपरेटर से सफल कॉल द्वारा लौटाई गई स्थिति।

यह तुरंत तो मान संग्रहीत की तुलना कहीं अधिक सुरक्षित है:

my $rc = system('ls myfile.txt'); 
if ($rc >> 8 != 0) { 
    # do something because ls exited with an error 
} 
+0

बढ़िया! यही वह है जिसे मैं सुनना और सुनिश्चित करना चाहता था। धन्यवाद। मुझे '$?' की अस्थिरता (सी में इरनो की तरह) के बारे में पता है और अगर इसका कोई स्पष्ट $ आरसी उपलब्ध नहीं है (बैकटिक्स के साथ) तो इसका उपयोग केवल तभी करें। मैं वैसे भी स्पष्ट वर्स पसंद करता हूं और जब भी संभव हो तो '$ _' से बचें। आईएमएचओ पठनीयता और रखरखाव बहुत अधिक _magic_ vars का उपयोग करने से पीड़ित है। तो मैं '$ आरसी' के साथ रहूँगा। :-) – PerlDuck

+2

'$? 'सी के सम्मानजनक' इरनो 'जैसा बिल्कुल वैसा ही है जिसका अर्थ है कि इसमें बहुत सी समस्याएं हैं। जादुई वैश्विक चर निश्चित रूप से एक बार एक महान विचार की तरह लग रहा था, लेकिन शुक्र है कि हम आगे बढ़ गए हैं। – tadman

+3

@tadman वास्तव में, '$!' बिल्कुल 'errno' जैसा ही है (यह केवल 'errno' के वर्तमान मान को पुनर्प्राप्त करता है)। '$?'थोड़ा अलग है क्योंकि यह प्रत्येक' प्रतीक्षा 'या पाइप बंद करके सेट हो जाता है, भले ही वे सफल हों ('$!' विफलता के तुरंत बाद वैध है)। लेकिन आप वैश्विक चर के बारे में सही हैं। – ThisSuitIsBlackNot

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