2016-10-04 4 views
7

मैं सिर्फ एक स्थिति है जहाँ and और && व्यवहार अलग तरह से चेतावनी के संबंध में सामना करना पड़ा।केवल कम पूर्वता शॉर्ट सर्किट ऑपरेटरों के साथ शून्य संदर्भ के बारे में चेतावनी

यहाँ and साथ मूल स्क्रिप्ट है।

#!/usr/bin/env perl 
use strict; 
use warnings 'FATAL' => qw[all]; 

my $var1; 
my $var2; 

my $defined = (defined $var1) and (defined $var2); 

print ($defined ? "defined\n" : "undefined\n"); 

क्योंकि पहली शर्त गलत है, दूसरा अभिव्यक्ति में और मूल्यांकन किया है कभी नहीं किया गया है।

% perl defined.pl 
Useless use of defined operator in void context at defined.pl line 8. 
Exit 255 

लेकिन अगर मैं उच्च पूर्वता को आपरेशन बदल लेकिन अन्यथा समान &&, मैं एक शून्य संदर्भ चेतावनी नहीं मिलता है।

#!/usr/bin/env perl 
use strict; 
use warnings 'FATAL' => qw[all]; 

my $var1; 
my $var2; 

my $defined = (defined $var1) && (defined $var2); 

print ($defined ? "defined\n" : "undefined\n"); 

कार्यक्रम अपेक्षित परिणाम, "undefined\n" उत्पन्न करता है।

% perl defined.pl 
undefined 

perldoc perlop पता चलता है कि and और && पूर्वता के लिए छोड़कर सभी मामलों में समान होना चाहिए, लेकिन स्पष्ट रूप से यह नहीं बताता है।

& & के विकल्प के रूप में || जब नियंत्रण प्रवाह के लिए इस्तेमाल किया, पर्ल और और या ऑपरेटरों (नीचे देखें) प्रदान करता है। शॉर्ट-सर्किट व्यवहार समान है। की पूर्वता "और" और "या" बहुत कम हालांकि, इसलिए कि आप सुरक्षित रूप से उन्हें एक सूची ऑपरेटर के बाद जरूरत बिना कोष्ठक के लिए उपयोग कर सकते हैं,:

+2

* "यदि मैं ऑपरेशन को निम्न प्राथमिकता में बदलता हूं लेकिन अन्यथा समान '&&' "*' && '" ऑपरेटर के पास 'और' से अधिक * प्राथमिकता है। – Borodin

+2

"' perldoc perlop' पता चलता है कि 'and' और' '&& पूर्वता के लिए छोड़कर सभी मामलों में समान होना चाहिए, लेकिन स्पष्ट रूप से यह नहीं बताता है।" मुझे यकीन नहीं है कि आप इसे कितना स्पष्ट करना चाहते हैं। यह स्पष्ट रूप से कहता है "' और 'और' या' ** की प्राथमिकता ** बहुत कम है "। –

+0

यह दस्तावेज में नहीं बताता है कि 'undef' and' चेतावनी के संबंध में' '&& और' द्वारा उसी तरह व्यवहार किया जाता है। मैंने सोचा कि यह कल्पना की जा सकती है कि वे हमेशा एक ही मूल्य के समान मूल्यों को वापस कर सकते हैं और एक ही परिस्थिति में उनके सही तर्क का मूल्यांकन कर सकते हैं लेकिन चेतावनियों के साथ अलग-अलग बातचीत कर सकते हैं। मैं गलत था, लेकिन मैंने उस समय सोचा था कि यह एक संभावना थी। –

उत्तर

12

असाइनमेंट ऑपरेटर एक higher precedenceand से है, इसलिए

my $defined = (defined $foo) and (defined $bar); 

(my $defined = (defined $foo)) && (defined $bar); 

के बराबर है आप B::Deparse के साथ इस देख सकते हैं:

$ perl -MO=Deparse -e'my $defined = (defined $foo) && (defined $bar)'                
my $defined = defined $foo && defined $bar; 
-e syntax OK 

$ perl -MO=Deparse -e'my $defined = (defined $foo) and (defined $bar)' 
defined $bar if my $defined = defined $foo; 
-e syntax OK 
संबंधित मुद्दे