हम Intermediate Perl में गहराई से इसकी व्याख्या करते हैं।
चर लुकअप के लिए सामान्य वाक्य रचना है:
SIGIL BLOCK INDEXY-THING
एक सरल अदिश कि लगता है कि के लिए:
print $ { foo };
आप शायद इस देखा है जब आप आसपास के चीजों से एक चर नाम को अलग करने की जरूरत है यह:
print "abc${foo}def\n";
यदि आपके पास ब्लॉक में एक पर्ल पहचानकर्ता है और कोई आसपास गंदगी, आप ब्रेसिज़ बंद छोड़ सकते हैं, जो आम मामला है:
print $foo;
बहरहाल, यह एक संदर्भ अपसंदर्भन के लिए एक ही बात है:
SIGIL BLOCK-RETURNING-REFERENCE INDEXY-THINGS
तो बात यह है कि आप में मिलता है ब्लॉक, एक संदर्भ है पर्ल यह भिन्नता की कोशिश करता है की तरह आप भी इसे पूछा:
my $ref = \ '12345';
print $ { $ref };
हालांकि कोई वास्तविक ब्लॉक है यही कारण है, और न सिर्फ चीनी। जैसा कि आप में जितने चाहें उतने बयान हो सकता है:
print $ { my $ref = \ '1234'; $ref };
अब आप सिर्फ एक पर्ल पहचानकर्ता निर्दिष्ट नहीं कर रहे हैं, इसलिए पर्ल स्वीकार नही करता है कि आप इसे एक पहचानकर्ता दे रहे हैं और यह कोड का उपयोग करता कार्यान्वित एक संदर्भ के रूप में परिणाम। इन लगभग समान say
बयानों के बीच अंतर पर विचार करें:
use 5.010;
our $foo = "I'm the scalar";
sub foo { \ "I'm the sub" }
say ${foo};
say ${foo;};
कि दूसरी say
पर्ल में सेमी-कोलन को देखता है, यह जानता है यह एक पहचानकर्ता नहीं है, पाठ के रूप में ब्रेसिज़ के अंदर कोड की व्याख्या, और परिणाम देता है। चूंकि परिणाम एक संदर्भ है, इसलिए यह ${...}
का उपयोग इसे अस्वीकार करने के लिए करता है। इससे कोई फर्क नहीं पड़ता कि आप यह कहां करते हैं, ताकि आप इसे डबल-उद्धृत स्ट्रिंग के अंदर कर सकें, विशेष नहीं है।
इसके अलावा, our
पर ध्यान दें। यही कारण है कि अब महत्वपूर्ण है कि आप कुछ में थोड़ा और अधिक मुश्किल विचार करने के लिए जा रहे हैं:
use 5.010;
our $foo = "I'm the scalar";
sub foo { \ "I'm the sub" }
sub baz { 'foo' }
say ${foo};
say ${foo;};
say ${baz;};
पर्ल है कि पिछले say
कोड के रूप में intreprets है और देखता है परिणाम एक संदर्भ नहीं है, यह सरल स्ट्रिंग foo
है। पर्ल देखता है कि यह संदर्भ नहीं है लेकिन अब यह एक संदर्भ संदर्भ में है, इसलिए यह एक प्रतीकात्मक संदर्भ (Greg Bacon describes) के रूप में करता है। चूंकि प्रतीकात्मक संदर्भ प्रतीक तालिका में चर के साथ काम करते हैं, इसलिए $foo
को एक पैकेज चर होना था।
चूंकि इसे गड़बड़ करना आसान है, strict
इसके लिए एक आसान जांच है। हालांकि, जब आप इसे बंद करते हैं, तो यह आपको काटते समय आश्चर्यचकित न हों। :)
आपने स्पष्ट रूप से कहा है कि आप प्रतीकात्मक संदर्भों का उपयोग करना चाहते हैं और 'perl' ने आपकी बोली-प्रक्रिया की है। –
इस तरह dereferencing काम करता है। आपको सहायक मिल सकता है: http://perlmonks.org/?node=References+quick+reference – ysth