2013-02-15 7 views
15

जबकि The Camel Book के नवीनतम संस्करण मैं p522 पर निम्नलिखित कोड टुकड़ा के घेरे में आ गया था पढ़ने:क्या आपको '||' का उपयोग करना चाहिए या कम प्राथमिकता 'या' पर्ल में एक त्रुटि की रिपोर्ट करते समय?

use Fcntl ":flock"; 
eval { 
    local $SIG{ALRM} = sub { die "alarm clock restart" }; 
    alarm 10;    # schedule alarm in 10 seconds 
    eval { 
     flock(FH, LOCK_EX) # a blocking, exclusive lock 
      || die "can't flock: $!"; 
    }; 
    alarm 0;    # cancel the alarm 
}; 
alarm 0;    # race condition protection 
die if [email protected] && [email protected] !~ /alarm clock restart/; # reraise 

मैं सिखाया गया था कि आप हमेशा कम पूर्वता तार्किक OR ऑपरेटर 'या' तार्किक वरीयता में उपयोग करना चाहिए या ऑपरेटर '||'।

पुस्तक में आगे देखकर, मुझे एक ही तर्क का उपयोग करके कई अन्य उदाहरण दिखाई देते हैं।

क्या नियमों या प्राथमिकता के स्तर बदल गए हैं?

या '||' का संचालन है और 'या' पर्ल के बाद के संस्करणों में बदल गया? (दुर्भाग्यवश, विरासत कोड के कारण हम 5.6.1 एटीएम में वेल्डेड हैं)।

उत्तर

22

|| और or की प्राथमिकता नहीं बदला है। die साथ || का उपयोग करना,

flock FH, LOCK_EX || die "can't flock: $!"; # WRONG! 

पर विचार है यही कारण है कि कुछ लोगों को नियंत्रण संरचनाओं के लिए or पसंद करते हैं अगर आप समारोह विशेषताओं के आसपास कोष्ठकों का उपयोग नहीं कर रहे हैं एक सा खतरनाक है। कोष्ठक के साथ, कोई फर्क नहीं पड़ता है।

+3

मैं उपयोग करना पसंद करता हूं || तर्क के लिए (उदा। 'if' स्थिति के अंदर) और 'या' नियंत्रण प्रवाह के लिए (जैसे ... या मर)। – rjh

+1

धन्यवाद @ चोरोबा, इसलिए यह एक दिलचस्प मुद्दा उठाता है। निम्न प्राथमिकता तार्किक या पसंद करने के विचार की सर्वव्यापी प्रकृति को देखते हुए, TheCameBook '||' का उपयोग करके चीजों को जटिल क्यों करता है ऑपरेटर जो केवल परिस्थिति में काम करेगा जहां कोष्ठक का उपयोग किया जाता है? दिलचस्प। लगता है कि यह TMTOWTDI है! (: –

+1

मुझे लगता है कि अगर कोई ऊंट बुक के माध्यम से जाता है और एक पूर्ण कोड क्लीनअप करता है, तो वह उदाहरण 'या' में बदल जाएगा। –

1

[एक शैली के सवाल के रूप में, यह शायद सीडब्ल्यू होना चाहिए। उस ने कहा, मेरे पास राय है।]

ऊंट शैली के लिए एक भयानक गाइड है; यह उसका काम नहीं है। जो कोड प्रस्तुत करता है वह सही होगा कि यह टिन पर जो कुछ भी कहता है वह करता है, लेकिन इसके उदाहरणों को वास्तविक उपयोग में बदलना ज्यादातर पाठक के लिए एक अभ्यास के रूप में छोड़ दिया जाता है।

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

if ($x or $y) { ... } 
if (my $z = $x || $y) { ... } 
$x or die "Ohnoes!"; # Though I prefer `die "Ohnoes!" unless $x;` 
return 5 unless $x and $y; 
return $x && $y; # Important! `return $x and $y;` is really-really wrong 

यह आपको न्यूनतम संश्लेषण के साथ अधिकांश कोड के माध्यम से देखेगा।

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

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