वैश्विक मॉड्यूल चर अतीत में प्रचलित थे, लेकिन आधुनिक पर्ल में एक इंटरफेस के रूप में "खराब रूप" माना जाता था। यह पहचानना महत्वपूर्ण है कि पर्ल अब 22-23 साल पुराना है, और शैलियों और प्रथाओं में बदलाव आया है। :) ध्यान दें कि ऐसे समय होते हैं जब यह अभी भी उपयुक्त है, क्योंकि कुछ चरम विशेषताएं हैं जो पैकेज चर के साथ आती हैं। यह सामान्य रूप से अनुभव और अभ्यास का मामला है कि यह देखने के लिए कि एक अच्छा समाधान क्या हो सकता है।
पैकेज चर के लिए सबसे अच्छा उपयोग समझने के लिए, आपको वास्तव में यह समझने की आवश्यकता है कि local
काम करता है। local
's perldoc help देखें। स्थानीय आपको पैकेज पैरामीटर जैसे (उदाहरण के रूप में) $My::Variable
पैकेज My
पैकेज में ले जाने देता है, और इसके dynamically scoped संस्करण बना देता है। आम तौर पर यदि आप $My::Variable
जगह में बदलते हैं, तो यह आपके पूरे कार्यक्रम को प्रभावित करेगा, और जारी रहेगा। छोटे कार्यक्रमों के लिए, यह एक बड़ा सौदा नहीं हो सकता है। बड़े लोगों के लिए, यह विनाशकारी साइड इफेक्ट्स हो सकता है। local
आपको उस चर में अस्थायी परिवर्तन करने देता है, जो आपके वर्तमान दायरे तक सीमित है। प्रभावी ढंग से
use 5.012;
use warnings;
package My;
our $Variable = 5;
package main;
say $My::Variable; # prints 5
$My::Variable = 7;
say $My::Variable; # prints 7
{ # create a new lexical scope
local $My::Variable = 10; # create a new dynamic scope for $My::Variable
# that will persist to the end of the lexical scope
say $My::Variable; # prints 10
}
say $My::Variable; # end of the lexical scope for the localized
# $My::Variable, so prints 7 again
, यह आप एक सुरक्षित तरीका में पैकेज चर का उपयोग करने देता है:
यह ऐसे काम करता है। दुर्भाग्यवश, हर कोई स्थानीय के बारे में नहीं जानता, इसलिए वे अक्सर वैश्विक चर को पकड़ते हैं। अच्छा उपयोग दस्तावेज (उदाहरण के लिए, local
) हमेशा मदद करता है।
उचित वस्तु encapsulation के साथ एक गेटर/सेटर इस बहुत से रोकता है, लेकिन हमेशा नहीं। स्थानीय वैरिएबल के तरीके को काम करने के लिए, आपको बहुत अधिक काम करना होगा। एक पैकेज वैरिएबल को स्थानांतरित करने में सक्षम होने के बारे में सबसे अच्छी बात यह है कि आप एक डीबग चर के लिए, आसानी से अस्थायी परिवर्तन कर सकते हैं। आम तौर पर, आप की तरह एक पैटर्न क्या करना है:
{
my $current_variable My::get_variable();
$My::set_variable($new_value);
# Do code work
$My::set_variable($current_variable);
}
स्थानीय के साथ
, इस हो जाता है:
{
local $My::Variable = $new_value;
# do code work
}
(संयोग से, मैं तुम्हें एक ही कारण के लिए भी शाब्दिक चर को यह कर सकता है, इच्छा .. लेकिन आप नहीं कर सकते हैं।) तो, कुछ चीजों के लिए, पैकेज चर समझ में आ सकते हैं। यह इस बात पर निर्भर करता है कि आप इसका उपयोग कैसे करना चाहते हैं।
- डिबगिंग चर जैसी चीजें
- वैश्विक विन्यास जो ऐसा नहीं करता/नहीं अक्सर
, बदला जाना चाहिए हालांकि, अगर यह कुछ है कि एक नियमित आधार पर परिवर्तित करने की आवश्यकता है है जैसे
- नियमित रूप से चर का इस्तेमाल किया (
File::Find
के लिए भयानक इंटरफ़ेस देखें)
- अस्थाई विन्यास
- "ऑब्जेक्ट" चर
असल में, कुछ भी जरूरत है कि एक बार से या दुर्लभ स्थितियों में अधिक संशोधित करने, या अन्यथा एक उत्पन्न वस्तु में समझाया जाना चाहिए, तो मैं पैकेज से बचने चाहते हैं चर।
ओह, कौन सा मॉड्यूल? –
बस इसके लिए जाओ। अगर वे इसे अस्वीकार करते हैं तो क्या। जीवन में बुरी चीजें होती हैं। –
तो * इसे * encapsulate। और आप इसे संदर्भ के रूप में उपयोग कर सकते हैं: http://stackoverflow.com/questions/1540539/how-do-you-localize-a-number-of-legacy-globals-without-eval – Axeman