my
के व्यवहार perlsub
में प्रलेखित है - यह इस करने पर निर्भर करता - perl
जानता $string
दायरे में है - क्योंकि my
यह इतना बताता है।
मेरी ऑपरेटर वाणी सूचीबद्ध चर lexically संलग्न ब्लॉक तक ही सीमित, सशर्त (यदि/जब तक/elsif/बाकी), लूप (के लिए/foreach/जबकि/जब तक/जारी रखने के लिए), सबरूटीन, eval, या फ़ाइल/उपयोग/उपयोग की गई फ़ाइल करें।
इसका मतलब है कि यह उस बिंदु से 'गुंजाइश' है जिस पर यह 'ब्लॉक' के समापन ब्रैकेट तक पहली बार देखा गया है। (या आपके उदाहरण में - कोड का अंत)
हालांकि - आपके उदाहरण में my
भी एक मान निर्दिष्ट करता है।
यह स्कोपिंग प्रक्रिया संकलन समय पर होती है - जहां पर्ल चेक करता है कि यह $string
का उपयोग करने के लिए मान्य है या नहीं। (strict
के लिए धन्यवाद)। हालांकि - यह नहीं पता कि मूल्य क्या था, क्योंकि कोड निष्पादन के दौरान यह बदल सकता है। (और विश्लेषण करने के लिए गैर तुच्छ है)
तो अगर आप ऐसा करते हैं यह एक छोटे से स्पष्ट हो सकता है क्या हो रहा है:
#!/usr/bin/env perl
use strict;
use warnings;
my $string; #undefined
func();
$string = 'string';
func();
sub func {
print $string, "\n";
}
$string
दोनों ही मामलों में दायरे में है - क्योंकि my
संकलन समय पर हुआ - subroutine कहा जाने से पहले - लेकिन पहले आमंत्रण से पहले undef
के डिफ़ॉल्ट से परे एक मूल्य सेट नहीं है।
नोट इस विरोधाभासों के साथ:
#!/usr/bin/env perl
use strict;
use warnings;
sub func {
print $string, "\n";
}
my $string; #undefined
func();
$string = 'string';
func();
कौन सा त्रुटियों क्योंकि जब उप घोषित किया जाता है, $string
नहीं दायरे में है।
* हमेशा * 'सख्त उपयोग करें; चेतावनियों का प्रयोग करें; '! – Biffen
ओह या मैं वास्तव में उन परीक्षणों में मेरी परीक्षा फाइल में है। मैं इसे संपादित करूंगा। धन्यवाद। – darkgrin