2008-08-12 15 views
41

मेरे कार्यक्रम में पर्ल कोड का यह स्निपेट गलत परिणाम दे रहा है।पर्ल टर्नरी सशर्त ऑपरेटर समस्याओं के अंदर असाइनमेंट

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

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

उत्तर

80

यह पर्ल documentation में समझाया गया है।

पर्ल ऑपरेटर पूर्वता की वजह से

बयान के रूप में

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

पार्स किया जा रहा है क्योंकि: ऑपरेटर एक आबंटित परिणाम पैदा करता है, 3 की हालत का नतीजा सौंप दिया जाता।

जब $ शर्त सच यह साधन है ($ एक = 2) = 3 देने $ एक = 3

जब $ हालत झूठी इस का मतलब है ($ एक) = 3 देने $ एक = 3

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

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

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

+1

"जब $ हालत सच है इसका मतलब यह है $ एक = 2 ​​= 3 देने $ एक = 3" मैं होता सोचा $ एक = 2 ​​= 3 एक अभिव्यक्ति सिंटैक्स त्रुटि है या आवश्यक त्रुटि lvalue हैं या इस तरह के ... इसका मूल्यांकन कैसे किया जाता है? – sundar

+0

आप सही हैं मैं इसे संशोधित करूँगा यह $ (= a = 2) = 3 $ = 2 = 3 – Pat

21

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

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

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

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

और अगर आप चर का चयन करते हैं, लेकिन कोई बात नहीं क्या एक ही बात बताए, तो आप भी ऐसा कर सकता है:

हैं:

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

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

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

40

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

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

आपके मामले में, कि तुम्हें दिखाता हूँ:

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

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

+0

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

4
पर्ल ऑपरेटर पूर्वता की वजह से

बयान पार्स किया जा रहा है के रूप में:

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

क्योंकि: ऑपरेटर एक आबंटित परिणाम पैदा करता है, 3 की हालत का नतीजा सौंप दिया जाता।

जब $ हालत सच है इसका मतलब यह है $ एक = 2 ​​= 3 देने $ एक = 3

जब $ शर्त इसका मतलब यह है $ एक = 3 देने $ एक = 3

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

$a = $condition ? 2 : 3; 

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

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

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

या इस तरह?

if ($x < 3) { 
    $foo($x); 
} else { 
    $bar($y); 
} 
संबंधित मुद्दे