2012-02-16 8 views
9

में परिवर्तनीय घोषणा निम्नलिखित की तरह एक स्क्रिप्ट में, क्या यह संभव है कि 'मेरा' प्रभावी रूप से 'var' को प्रभावी रूप से घोषित करने के बिना और इसे ब्लॉक के बाहर दिखाई दे?BEGIN ब्लॉक

echo -e "\n\n\n" | \ 
    perl -lne 'BEGIN { my $var="declared & initialized once" } print $var' 

इसके अलावा, 'मेरे' के बिना var घोषित करने से यह BEGIN ब्लॉक के बाहर दिखाई देता है?

उत्तर

12

प्लेस एक my $var; से पहले BEGIN ब्लॉक:

$ perl -le 'my $var; BEGIN { $var = "declared"; } print $var;' 
declared 

my, चर शाब्दिक गुंजाइश देता है तो $varBEGIN ब्लॉक के बाहर अपने उदाहरण में परिभाषित नहीं है। my को प्रभावी ढंग से इसे एक वैश्विक चर बनाता है, जो असाइनमेंट के बाद स्क्रिप्ट में पहुंच योग्य है।

+0

संकलन आदेश मुझे थोड़ा सा पहेली करता है। चूंकि BEGIN ब्लॉक में $ var घोषित किया गया है, इसलिए बाद में 'my' के साथ घोषणा द्वारा इसे मिटाया नहीं गया है? –

2

इसके अलावा, 'मेरे' के बिना var घोषित करने से यह BEGIN ब्लॉक के बाहर दिखाई देता है?

आप इसे तब घोषित नहीं कर रहे हैं। यदि आप use strict (जो डिफ़ॉल्ट रूप से घोषणा को रोकता है) का उपयोग नहीं कर रहे हैं, तो यह वैश्विक के रूप में autodeclared है। एक लाइनर में, strict इससे मदद करता है इससे अधिक दर्द होता है; मैं इस तरह के संदर्भ में घोषणा नहीं कर रहा हूं।

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