2015-09-07 3 views
11

पर्ल में निम्नलिखित कार्यक्रमों पर विचार करें।पर्ल में केवल पढ़ने-योग्य या निरंतर मूल्य को अनदेखा की सूची क्यों नहीं है?

use strict; 
use warnings; 

my @foo = qw(a b c); 
undef = shift @foo; 

print scalar @foo; 

यह एक त्रुटि संदेश के साथ मर जाएगा:

Modification of a read-only value attempted at ...

एक constat का उपयोग करते हुए कोई दूसरी त्रुटि दे देंगे:

1 = shift @foo; 

Can't modify constant item in scalar assignment at ...
Execution of ... aborted due to compilation errors.

ही हम ऐसा करता है, तो:

(1) = shift @foo; 

उन सभी को मुझे समझ में आता है। लेकिन एक सूची में undef डालने से काम करेगा।

(undef) = shift @foo; 

अब यह 2 प्रिंट करता है।

बेशक यह आम बात है अगर आप वापसी मूल्यों का एक समूह है और केवल यहाँ जैसे विशिष्ट लोगों को चाहते हैं,:

my (undef, undef ,$mode, undef ,$uid, $gid, undef ,$size) = stat($filename); 

perldoc -f undef में कोड उदाहरण के 9 लाइन यह दिखाता है, butthere कोई explaination है।

मेरा सवाल यह है कि यह पर्ल द्वारा आंतरिक रूप से कैसे संभाला जाता है?

उत्तर

10

आंतरिक रूप से, पर्ल में स्केलर असाइनमेंट और सूची असाइनमेंट के लिए अलग-अलग ऑपरेटरों हैं, भले ही उनमें से दोनों को स्रोत कोड में = लिखा गया हो। और सूची असाइनमेंट ऑपरेटर के पास undef का विशेष मामला है जिसके बारे में आप पूछ रहे हैं।

+0

क्या आप स्रोत से लिंक प्रदान कर सकते हैं? – simbabque

+3

क्या, बिल्कुल? पर्ल का स्रोत कोड बिल्कुल सरल नहीं है। आप https://github.com/Perl/perl5/blob/blead/op.c पर देख सकते हैं और 'op_sassign' और' op_aassign' 'की खोज कर सकते हैं, अगर इससे मदद मिलती है। या, शायद अधिक उपयोगी, इस तरह कुछ करने से संकलित बाइटकोड देखें: 'perl -MO = terse -E' (undef) = 1; ' –

+0

क्षमा करें, मुझे अलग-अलग वाक्यांश करना चाहिए था। मेरा मतलब था, क्या आप उस स्पष्टीकरण को वापस करने के लिए कुछ प्रदान कर सकते हैं? चूंकि आपने दस्तावेज़ीकरण से लिंक नहीं किया है, क्योंकि मैंने माना है कि आपने इसे कहीं और देखा है, अधिकतर स्रोत। :) – simbabque

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