2012-03-14 20 views
11

मैं एक बयानपर्ल एक पंक्ति अगर बयान

$set eq "Y" ? $set = "N" : $set = "Y"; 

लेकिन कोई बात नहीं क्या यह हमेशा "N"

# Toggle setting 
if ($set eq "Y") 
{ 
    $set = "N"; 
} 
else 
{ 
    $set = "Y"; 
} 

एक लाइनर काम करने के लिए क्यों नहीं प्रतीत होता है करने के लिए सेट है?

+0

@ruakh: हाँ, लेकिन यह इसे '' '' से '' '' 'में नहीं बदलता है। –

+0

@ किथ थॉम्पसन: हाँ, आप सही हैं। ओपी ने कहा कि यह हमेशा इसे 'एन' पर सेट करता है, लेकिन वास्तव में सटीक विपरीत सत्य है। – ruakh

+0

ओह हाँ, यह सच है। मैं भूल गया कि मैंने उत्तर को अपने मूल पर वापस बदल दिया। –

उत्तर

25

पूर्वता नियमों के कारण, पर्ल अपने बयान को पार्स नहीं कर रहा है के रूप में आपको लगता है :

$ perl -MO=Deparse,-p -e '$set eq "Y" ? $set = "N" : $set = "Y"' 
((($set eq 'Y') ? ($set = 'N') : $set) = 'Y'); 
-e syntax OK 

तो जैसा कि आप देख, दोनों स्थितियों में, अंतिम परिणाम $set अदिश जो तब Y करने के लिए सेट हो जाता है।

आप कुछ कोष्ठक के साथ इसे ठीक कर सकते हैं:

$set eq "Y" ? $set = "N" : ($set = "Y") 

लेकिन क्यों काम दोहराने:

$set = $set eq 'Y' ? 'N' : 'Y'; 
+0

धन्यवाद, मेरे खराब पर्ल के रूप में गहराई से स्पष्टीकरण के लिए। मैं एक 'मेरा $ सेट = ($ सेट ईक' वाई '?' एन ':' वाई ') के साथ समाप्त हुआ; 'कीथ के जवाब में। –

8

ऑपरेटर पूर्वता काम करना चाहिए। क्या आपके द्वारा लिखी गई

($set eq "Y" ? $set = "N" : $set) = "Y"; 

के बराबर है आप इस तरह के संक्षिप्त कोड लिखने पर जोर देते हैं, तो यह अधिक मतलब:

$set = ($set eq "Y" ? "N" : "Y"); 
5

यह पूर्वता के बारे में है; के कोष्ठक के साथ आशय करते हैं, और उसके बाद पर्ल उन्हें फिर से निकाल देने के:

perl -MO=Deparse -e '($set eq "Y") ? ($set = "N") : ($set = "Y"); print $set' 
$set eq 'Y' ? $set = 'N' : ($set = 'Y'); 
print $set; 
-e syntax OK 

इस प्रकार parenthesing आपकी इच्छानुसार करने के लिए आवश्यक है कौन सा।

3

आप बल्कि 'सी' शैली सशर्त बयान का उपयोग नहीं हैं, तो आप 2 लाइनों के साथ एक ही बात कर सकते हैं:

my $set = "Y"; #Set the scope and default value 
$set = "N" if ($set eq "Y"); 

मैं व्यक्तिगत रूप से 'सी' शैली ऊपर दूसरों के द्वारा वर्णित की सलाह देते हैं ... यह आसानी से दो विकल्प एक चर हो सकता है प्रदर्शित करता है।

हालांकि, एक सशर्त परिणाम से निपटने के दौरान मैं जिस विधि को दिखाता हूं वह बहुत अच्छा है।

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