2015-03-27 6 views
7

Reading Excel के लिए प्रलेखन को देखते हुए, एक ऐसा बयान है जिसे मैं वास्तव में समझ नहीं पा रहा हूं।क्या है = = के लिए perl में?

क्या कोई बता सकता है कि $sheet -> {MaxRow} ||= $sheet -> {MinRow}; क्या करता है?

मुझे यह एक असाइनमेंट ऑपरेटर मिलता है। हालांकि मुझे समझ में नहीं आता कि कैसे काम करने के लिए || है?

उत्तर

12
$sheet -> {MaxRow} ||= $sheet -> {MinRow}; 

बराबर है। तो मैक्सरो 0 (संभवतः पहला पुनरावृत्ति) है, तो MaxRow MinRow का मान प्राप्त करेगा।

6

||= ऑपरेटर तार्किक-OR-असाइन है। यह += जैसा है, जो ऐड-असाइन है। यह तार्किक या एलएचएस और आरएचएस की गणना करता है, और उसके बाद परिणाम एलएचएस को सौंपता है, जो इसलिए वैध अंतराल होना चाहिए।

दूसरे शब्दों में, बस

$a += 3; 

रूप

$a = $a+3; 

के बराबर है हम कह सकते हैं कि

$a ||= 1; 

$a = $a||1; 
के बराबर है

अब, आपके प्रश्न में उल्लिखित बयान के संबंध में, ऊपर दिए गए मेरे उदाहरण की तुलना में वहां कुछ और चल रहा है। आपके बयान में, एलएचएस सिर्फ एक साधारण परिवर्तनीय टोकन नहीं है, लेकिन एक परिवर्तनीय टोकन है जिसे हैश संदर्भ ($sheet) के रूप में माना जा रहा है और स्ट्रिंग 'MaxRow' के साथ की गई मान प्राप्त करने के लिए इसे संदर्भित किया जा रहा है। आरएचएस $sheet पर हैश डेरफरेंस ऑपरेशन भी है, लेकिन जिसका कुंजी 'MinRow' है। लेकिन व्यवहार वही है; हम कह सकते हैं कि

$sheet->{'MaxRow'} ||= $sheet->{'MinRow'}; 

$sheet->{'MaxRow'} = $sheet->{'MaxRow'}||$sheet->{'MinRow'}; 

के बराबर है (नोट: मैं हमेशा स्पष्ट रूप से बोली तार कुंजी मान हैश करने के लिए पसंद करते हैं, क्योंकि वे क्या कर रहे हैं कि नहीं, बल्कि हर किसी की है कि डिग्री के लिए चला जाता है मुखरता।)

तार्किक या ऑपरेशन के बारे में अधिक जानकारी के लिए, http://en.wikipedia.org/wiki/Logical_disjunction देखते हैं, और पर्ल विशेष जानकारी के लिए, || और //) और http://perldoc.perl.org/perlop.html#Logical-or-and-Exclusive-Or के लिए http://perldoc.perl.org/perlop.html#C-style-Logical-Or (देखें (के लिए)। || पर पर्ल दस्तावेज़ से सबसे प्रासंगिक उद्धरण:

बाइनरी "||" एक शॉर्ट-सर्किट लॉजिकल या ऑपरेशन करता है। यही है, यदि बाएं ऑपरेंड सत्य है, तो सही ऑपरेंड का भी मूल्यांकन नहीं किया जाता है। स्केलर या सूची संदर्भ सही संचालन के लिए प्रचारित होता है यदि इसका मूल्यांकन किया जाता है।

यह पूरी तरह से इसे समझा नहीं जाता है; इस मामले में कि एलएचएस एक सच्चे मूल्य का मूल्यांकन करता है (परिभाषा के लिए नीचे देखें), तो || ऑपरेशन का वापसी मूल्य एलएचएस का मूल्य है, अन्यथा यह आरएचएस का मूल्य है।

पर्ल में, तार्किक मान आम तौर पर 0 (या कभी कभी '' या undef) झूठे के लिए और 1 सच के लिए प्रतिनिधित्व कर रहे हैं।हालांकि, अधिक विशिष्ट होने के लिए, उपर्युक्त तीन झूठे मूल्यों में से कोई भी मान सही नहीं माना जाता है, और कभी-कभी प्रोग्रामर अनौपचारिक शब्दों "सत्य" और "झूठी" का उपयोग करके इस भेद को संदर्भित करते हैं। IOW, 0, '', और undef झूठी हैं, और बाकी सब कुछ सत्य है। अधिक जानकारी के लिए http://www.perlmonks.org/?node=what%20is%20true%20and%20false%20in%20Perl%3F देखें।

$sheet -> {MaxRow} = ($sheet -> {MaxRow} || $sheet -> {MinRow}); 

स्थानीय OR ऑपरेटर दूसरे संकार्य ही अगर पहले एक गलत है का मूल्यांकन करता है: करने के लिए

+0

क्या इसका कोई संस्करण है जो पहले दाएं हाथ का मूल्यांकन करता है? मैं एक शॉर्टकट की तलाश में हूं जिसका अर्थ है '$ a = $ b अगर $ b'। – felwithe

+0

@ फ़ेलविथ यह इस बात पर निर्भर करता है कि आप '$ ए' के ​​साथ क्या करना चाहते हैं, इस मामले में कि आरएचएस सशर्त मूल्यांकन गलत साबित होता है। यदि आप '$ a' के मौजूदा मान को बनाए रखना चाहते हैं, तो आपका असाइनमेंट कथन इस तरह काम करता है, क्योंकि इन्फिक्स 'if' ऑपरेटर आपके द्वारा लिखे गए कार्यों के रूप में काम करता है, और असाइनमेंट को इसके सशर्त होने पर रोक देगा झूठा है यदि आप 'डिफ़ॉल्ट' मान जैसे 'undef'' चाहते हैं, तो मुझे लगता है कि आपके प्रश्न का उत्तर तकनीकी रूप से नहीं है, लेकिन आप इसे करने के लिए एक सबराउटिन लिख सकते हैं: 'sub if2 {वापसी $ _ [1]? $ _ [0]: अनिश्चित; } ', और फिर इसे कॉल करने के लिए: '$ a = if2 $ b, $ b;'। – bgoldst

+0

हाय - मेरा मतलब है जैसे यह कहता है। मैंने सोचा कि शायद एक निफ्टी पर्ल शॉर्टकट था जिसे मैं नहीं जानता था। – felwithe