2009-07-16 23 views
29

सी-स्टाइल ऑपरेटरों &&, ||, और उनके पर्ल मानव-पठनीय संस्करण "and", "or", ... के बीच क्या अंतर है?क्या "||" के बीच अंतर है और "या" पर्ल में?

open (FILE, $file) or die("cannot open $file"); 
open (FILE, $file) || die("cannot open $file"); 
+9

एक अच्छा प्राथमिकता चार्ट के लिए 'perldoc perlop' देखें, और अधिक उदाहरणों के लिए "लॉजिकल या" पर अनुभाग देखें: http://perldoc.perl.org/perlop.html#Operator- प्रेसीडेंस- और- एसोसिएटिविटी – Telemachus

+6

इसके अलावा , लेक्सिकल फ़ाइल हैंडल और खुले तीन-तर्क रूप का उपयोग करें। मरने के तर्क में सिस्टम द्वारा लौटाई गई त्रुटि को शामिल करें: ** 'मेरी $ file_h खोलें,' <', $ फ़ाइल या मरें "$ फ़ाइल नहीं खोल सकते' $: '$!"; '** –

+1

या" ऑटोोडी का उपयोग करें " – jrockway

उत्तर

33

पर्ल डॉक्टर से ..

  • या

इस सूची में ऑपरेटर है। एक सूची ऑपरेटर के दाईं ओर, यह बहुत कम पूर्वता, ऐसी है कि वह वहाँ पाया सभी अल्पविराम से अलग भाव को नियंत्रित करता है। कम पूर्वता के साथ ही ऑपरेटरों तार्किक ऑपरेटरों "और" कर रहे हैं "या", और "नहीं" है, जो अतिरिक्त कोष्ठकों की आवश्यकता के बिना ऑपरेटरों सूची कॉल का मूल्यांकन करने के लिए इस्तेमाल किया जा सकता है। लॉजिकल या, परिभाषित या, और एक्सक्लूसिव या

बाइनरी "या" आसपास के अभिव्यक्तियों के तार्किक संयोजन को लौटाता है। यह बराबर है || बहुत कम प्राथमिकता को छोड़कर। जैसे कि, सही अभिव्यक्ति मूल्यांकन किया जाता है केवल अगर बाईं अभिव्यक्ति गलत है: यह यह उपयोगी नियंत्रण के लिए प्रवाह

print FH $data  or die "Can't write to FH: $!"; 

इसका मतलब यह है कि यह शॉर्ट सर्किट है कि बनाता है। इसके पूर्वता के कारण, तो आप शायद ही नियंत्रण प्रवाह के लिए काम के लिए इस का उपयोग करते हुए, से बचना चाहिए।

$a = $b or $c;  # bug: this is wrong 
($a = $b) or $c;  # really means this 
$a = $b || $c;  # better written this way 

हालांकि, जब यह एक सूची-संदर्भ असाइनमेंट है और आप "||" का उपयोग करने की कोशिश कर रहे हैं नियंत्रण प्रवाह के लिए, आपको शायद "या" की आवश्यकता है ताकि असाइनमेंट में उच्च प्राथमिकता हो।

@info = stat($file) || die;  # oops, scalar sense of stat! 
@info = stat($file) or die;  # better, now @info gets its due 

फिर फिर, आप हमेशा कोष्ठक का उपयोग कर सकते हैं।

  • ||

किसी भी सूची ऑपरेटर (प्रिंट(), आदि) या किसी एकल ऑपरेटर (chdir(), आदि) अगले निशानी के रूप में एक बाएं कोष्ठक द्वारा पीछा किया जाता है, तो कोष्ठकों के भीतर ऑपरेटर और तर्क लिया जाता है सामान्य कार्य कॉल की तरह, उच्चतम प्राथमिकता के लिए। उदाहरण के लिए, क्योंकि नामित एकल ऑपरेटरों से || उच्च पूर्वता हैं:

chdir $foo || die; # (chdir $foo) || die 
chdir($foo) || die; # (chdir $foo) || die 
chdir ($foo) || die; # (chdir $foo) || die 
chdir +($foo) || die; # (chdir $foo) || die 
+0

स्वीकृत उत्तर, क्योंकि यह डेव हिनटन के –

33

फर्क सिर्फ इतना है उनके पूर्वता है:

ऐसा नहीं है कि इंटरनेट कोड उन दोनों का उपयोग करता है लगता है।

open FILE, $file or die("cannot open $file"); # this works 
open FILE, $file || die("cannot open $file"); # this doesn't work 
open FILE, ($file || die("cannot open $file")); # why it doesn't work 
7

"& &" और "||" ऑपरेटरों के पास उनके "और", "या" समकक्षों की तुलना में अधिक प्राथमिकता होती है।

20

!, &&, ||, और ^ उच्च पूर्वता ऐसी है कि वे एक अभिव्यक्ति के निर्माण में उपयोगी होते हैं है; not, and, or, और xor कम पूर्वता ऐसी है कि वे क्या अनिवार्य रूप से अलग अभिव्यक्ति कर रहे हैं के बीच प्रवाह नियंत्रण के लिए उपयोगी होते हैं।

+1

से अधिक पूर्ण है क्योंकि मुझे यह उत्तर स्वीकृत उत्तर से अधिक पसंद है, बहुत छोटा और आपको वह उत्तर देता है जो आपको चाहिए। – Rafid

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