पर्ल टर्नरी सशर्त ऑपरेटर समस्याओं के अंदर असाइनमेंट

मेरे कार्यक्रम में पर्ल कोड का यह स्निपेट गलत परिणाम दे रहा है।

$condition ? $a = 2 : $a = 3 ;
print $a;

इससे कोई फर्क नहीं पड़ता कि $ condition का मान क्या है, आउटपुट हमेशा 3 होता है, कैसे आते हैं?

0
ro fr bn

5 उत्तर

यह पर्ल दस्तावेज़ में समझाया गया है।

पर्ल ऑपरेटर की प्राथमिकता के कारण कथन को पार्स किया जा रहा है

($condition ? $a= 2 : $a ) = 3 ;

क्योंकि?: ऑपरेटर एक असाइन करने योग्य परिणाम उत्पन्न करता है, 3 स्थिति के परिणाम के लिए आवंटित किया जाता है।

जब $ शर्त सही होती है तो इसका मतलब है ($ a = 2) = 3 $ a = 3 दे रहा है

जब $ शर्त गलत होती है तो इसका मतलब है ($ ए) = 3 $ a = 3 दे रहा है

इसे लिखने का सही तरीका है

$a = ( $condition ? 2 : 3 );
print $a;

हमने काम पर इस पर काट दिया, इसलिए मैं यहां पोस्ट कर रहा हूं कि उम्मीद है कि दूसरों को यह उपयोगी लगेगा।

0
जोड़ा
आप सही हैं मैं इसे संशोधित कर दूंगा ($ a = 2) = 3 $ = 2 = 3 के बजाय
जोड़ा लेखक Pat, स्रोत
"जब $ शर्त सही होती है तो इसका अर्थ यह है कि $ a = 2 = 3 $ a = 3 दे रहा है" मैंने सोचा होगा कि $ a = 2 = 3 एक अभिव्यक्ति वाक्यविन्यास त्रुटि होगी या lvalue आवश्यक त्रुटि या ऐसे ... यह वास्तव में कैसे प्राप्त होता है का मूल्यांकन?
जोड़ा लेखक sundar, स्रोत

ऊपर टिथोनियम के उत्तर के लिए एक सुझाव:

यदि आप एक ही चर के लिए अलग-अलग मान असाइन करना चाहते हैं, तो यह बेहतर हो सकता है (कॉपी-बुक तरीका):

$ ए = ($ शर्त)? 2: 3;

0
जोड़ा

बस पिछले जवाब का विस्तार करने के लिए ... यदि, किसी भी कारण से, असाइनमेंट को सशर्त का हिस्सा बनने की आवश्यकता है, तो आप इसे इस प्रकार लिखना चाहते हैं:

$condition ? ($a=2) : ($a=3);

यह उपयोगी होगा यदि आप इस स्थिति के आधार पर विभिन्न चरों को असाइन कर रहे हैं।

$condition ? ($a=2) : ($b=3);

और यदि आप चर का चयन कर रहे हैं, लेकिन एक ही चीज़ को असाइन करना चाहे कोई फर्क नहीं पड़ता, तो आप यह भी कर सकते हैं:

($condition ? $a : $b) = 3;
0
जोड़ा

एक बार जब आप एक स्याही रखते हैं कि आप प्राथमिकता की समस्याओं से पीड़ित हो सकते हैं, तो यह समझने के लिए एक चाल है कि पर्ल ने क्या सोचा था:

perl -MO=Deparse,-p -e '$condition ? $a= 2 : $a= 3 ; print $a;'

आपके मामले में, यह आपको दिखाएगा:

(($condition ? ($a = 2) : $a) = 3);
print($a);
-e syntax OK

... जिस बिंदु पर आपको यह कहना चाहिए "ओह, यह बताता है"!

0
जोड़ा
अवसाद एक बहुत साफ पार्टी चाल है। बेशक, एक बार जब आपको प्राथमिकता की समस्या पर संदेह हो जाता है, तो आप आमतौर पर समाधान के लिए सबसे अधिक तरीके से होते हैं ;-)
जोड़ा लेखक RET, स्रोत

पर्ल ऑपरेटर की प्राथमिकता के कारण कथन का विश्लेषण इस प्रकार किया जा रहा है:

($condition ? $a = 2 : $a ) = 3 ;

क्योंकि?: ऑपरेटर एक असाइन करने योग्य परिणाम उत्पन्न करता है, 3 स्थिति के परिणाम के लिए आवंटित किया जाता है।

जब $ शर्त सही होती है तो इसका अर्थ है $ a = 2 = 3 $ a = 3 दे रहा है

जब $ शर्त गलत होती है तो इसका मतलब है कि एक = 3 $ a = 3 दे रहा है

इसे लिखने का सही तरीका है

$a = $condition ? 2 : 3;

आम तौर पर, आपको वास्तव में असाइनमेंट करने के लिए सशर्त उपयोग करने की आदत से बाहर निकलना चाहिए, जैसा कि मूल उदाहरण में - यह ऐसी चीज है जो पर्ल को केवल लिखने के लिए प्रतिष्ठा प्राप्त करती है।

अंगूठे का एक अच्छा नियम यह है कि सशर्त केवल साधारण मूल्यों के लिए हैं, कभी साइड इफेक्ट्स के साथ अभिव्यक्ति नहीं करते हैं। जब आप या किसी और को अब से आठ महीने इस कोड को पढ़ने की जरूरत है, तो क्या आप इसे इस तरह पढ़ना पसंद करेंगे?

$x < 3 ? foo($x) : bar($y);

या इस तरह?

if ($x < 3) {
  $foo($x);
} else {
  $bar($y);
}
0
जोड़ा