जाहिरा तौर पर use strict
(जरूरी) का उपयोग किया है जब आप कोड को ठीक से जो घोषणा के लिए मजबूर किया जा सकता है करने के लिए बल पर्ल करना चाहते हैं, तार और बाद के चरणों पर स्पष्ट किया जा रहा barewords यानी या सावधानी के साथ refs का उपयोग कर देना चाहिए। नोट: यदि त्रुटियां हैं, तो सख्ती से उपयोग करने पर निष्पादन समाप्त हो जाएगा।
जब use warnings;
आप प्रोग्राम में टाइपिंग की गलतियाँ ढूंढने में मदद करेंगे जैसे कि आप एक अर्धविराम से चूक गए थे, तो आपने 'अन्य' का इस्तेमाल किया था और 'एल्सिफ़' का नहीं, आप डिप्रेक्टेड सिंटैक्स या फ़ंक्शन का उपयोग कर रहे हैं, जो भी ऐसा हो। नोट: चेतावनियों का उपयोग केवल चेतावनी प्रदान करेगा और निष्पादन जारी रखेगा अर्थात निष्पादन को निरस्त न करे ।।
वैसे भी, बेहतर होगा कि हम विवरण में जाएं, जिसे मैं नीचे बता रहा हूं
से perl.com (मेरी पसंदीदा):
सख्त 'vars' का उपयोग करें;
जिसका अर्थ है कि आपको उन्हें उपयोग करने से पहले हमेशा चर घोषित करना चाहिए।
यदि आप घोषित नहीं करते हैं तो आपको शायद अघोषित चर के लिए त्रुटि संदेश मिलेगा
वैश्विक प्रतीक "$ varablename" में scriptname.pl लाइन 3 पर स्पष्ट पैकेज नाम की आवश्यकता होती है
इस चेतावनी का अर्थ है कि पर्ल के बारे में बिल्कुल स्पष्ट नहीं है कि चर का दायरा क्या है। तो आपको अपने चर के बारे में स्पष्ट होने की आवश्यकता है, जिसका अर्थ है कि या तो उन्हें घोषित करना my
ताकि वे वर्तमान ब्लॉक तक ही सीमित रहें, या उनके पूर्ण योग्य नाम के साथ उनका उल्लेख करें (उदाहरण के लिए: $ MAIN :: varablename)।
यदि आप किसी चर को एक्सेस करने का प्रयास करते हैं तो कंपाइल-टाइम त्रुटि शुरू हो जाती है, जो निम्न मानदंडों में से कम से कम एक को पूरा नहीं करता है:
Perl द्वारा पूर्वनिर्धारित, जैसे @ARGV,% ENV और सभी वैश्विक विराम चिह्न जैसे $। या $ _।
हमारे (एक वैश्विक के लिए) या मेरे (एक शाब्दिक के लिए) के साथ घोषणा की।
दूसरे पैकेज से आयात किया गया। (उपयोग वर्जन प्राग्मा आयात आयात करता है, लेकिन हमारे बजाय इसका उपयोग करें।)
पूरी तरह से अपने पैकेज के नाम और डबल-कोलोन पैकेज सेपरेटर का उपयोग करके योग्य है।
सख्त 'उप' का उपयोग करें;
दो कार्यक्रमों पर विचार करें
# prog 1
$a = test_value;
print "First program: ", $a, "\n";
sub test_value { return "test passed"; }
Output: First program's result: test_value
# prog 2
sub test_value { return "test passed"; }
$a = test_value;
print "Second program: ", $a, "\n";
Output: Second program's result: test passed
दोनों ही मामलों में हमारे पास एक test_value () उप है और हम इसका परिणाम $ a में डालना चाहते हैं। और फिर भी, जब हम दो प्रोग्राम चलाते हैं, तो हमें दो अलग-अलग परिणाम मिलते हैं:
पहले कार्यक्रम में, हम जिस बिंदु पर $a = test_value;
पहुंचते हैं, पर्ल को किसी भी test_value () उप का पता नहीं होता है, और test_value को स्ट्रिंग 'test_value' के रूप में व्याख्या की जाती है। दूसरे प्रोग्राम में, $a = test_value;
लाइन से पहले test_value () की परिभाषा आती है । Perl सोचता है कि test_value उप कॉल के रूप में है।
टेस्ट_वल्यू जैसे अलग-थलग शब्दों के लिए तकनीकी शब्द जो उप हो सकता है और संदर्भ के आधार पर तार हो सकता है, वैसे, नंगेपन है । नंगे पासवर्ड के पर्ल की हैंडलिंग भ्रामक हो सकती है, और यह प्रोग्राम में बग पैदा कर सकता है।
बग वह है जो हमने अपने पहले कार्यक्रम में सामना किया था, याद रखें कि पर्ल खोजने के लिए आगे नहीं आएगा test_value()
, इसलिए चूंकि यह पहले से ही test_value () नहीं देखा है, इसलिए यह मानता है कि आप एक स्ट्रिंग चाहते हैं। तो अगर तुम use strict subs;
, यह एक त्रुटि के साथ मरने के लिए इस कार्यक्रम का कारण होगा:
"सख्त उप" के उपयोग के लिए "%_" पर अनुमति नहीं है।
इस त्रुटि का समाधान
1 होगा । यह स्पष्ट करने के लिए कोष्ठकों का उपयोग करें कि आप उप को कॉल कर रहे हैं। यदि पर्ल $ a = test_value () देखता है, तो
2. पहले अपना उपयोग करने से पहले अपने उप की घोषणा करें
use strict;
sub test_value; # Declares that there's a test_value() coming later ...
my $a = test_value; # ...so Perl will know this line is okay.
.......
sub test_value { return "test_passed"; }
3. और यदि आप इसे एक स्ट्रिंग के रूप में उपयोग करने के लिए कहते हैं, तो इसे उद्धृत करें।
इसलिए, यह सख्ती पर्ल को सभी नंगे पासवर्ड को सिंटैक्स त्रुटियों के रूप में मानती है। * एक नंगेपन किसी भी नंगे नाम या पहचानकर्ता है जिसे संदर्भ द्वारा मजबूर कोई अन्य व्याख्या नहीं है। (संदर्भ अक्सर पास के कीवर्ड या टोकन से, या प्रश्न में शब्द के पूर्ववर्ती द्वारा मजबूर किया जाता है।) * तो यदि आप इसे एक स्ट्रिंग के रूप में उपयोग करने के लिए कहते हैं, तो इसे उद्धृत करें और यदि आप इसे फ़ंक्शन कॉल के रूप में उपयोग करने के लिए कहते हैं, तो इसे पूर्वनिर्धारित करें। या कोष्ठक का उपयोग करें।
इस अप्रत्याशित व्यवहार के कारण बेयरस खतरनाक हैं। use strict; (or use strict 'subs';)
उन्हें अनुमान लगाने योग्य बनाता है, क्योंकि नंगे पासवर्ड जो भविष्य में अजीब व्यवहार का कारण बन सकते हैं, इससे पहले कि वे कहर बरपा सकें, इससे आपका कार्यक्रम मर जाएगा
वहाँ एक जगह है जहाँ आप सख्त उप-चालू होने पर भी नंगे पासवर्ड का उपयोग करना ठीक है: जब आप हैश कीज़ असाइन कर रहे हैं।
$hash{sample} = 6; # Same as $hash{'sample'} = 6
%other_hash = ( pie => 'apple' );
हैश कीज़ में बेयरस को हमेशा स्ट्रिंग्स के रूप में व्याख्या किया जाता है, इसलिए कोई अस्पष्टता नहीं है।
सख्त 'रेफ्स' का उपयोग करें;
यदि आप प्रतीकात्मक संदर्भों का उपयोग जानबूझकर या अन्यथा करते हैं, तो यह एक रन-टाइम त्रुटि उत्पन्न करता है। एक मान जो एक कठिन संदर्भ नहीं है, फिर प्रतीकात्मक संदर्भ के रूप में माना जाता है । यही है, संदर्भ को एक वैश्विक चर के नाम का प्रतिनिधित्व करने वाले स्ट्रिंग के रूप में व्याख्या की जाती है।
use strict 'refs';
$ref = \$foo; # Store "real" (hard) reference.
print $$ref; # Dereferencing is ok.
$ref = "foo"; # Store name of global (package) variable.
print $$ref; # WRONG, run-time error under strict refs.
चेतावनी का उपयोग करें;
यह लेक्सिकली स्कोप्ड प्राग्मा पर्ल के अंतर्निहित चेतावनियों पर लचीले नियंत्रण की अनुमति देता है, जो संकलक द्वारा उत्सर्जित उन दोनों के साथ-साथ रन-टाइम सिस्टम से भी।
से perldiag
:
इसलिए नीचे दिए गए वर्गीकरणों में से अधिकांश चेतावनी संदेशों का अर्थ है कि डब्ल्यू, डी एंड एस को warnings
प्रागमा का उपयोग करके नियंत्रित किया जा सकता है ।
(डब्लू) एक चेतावनी (वैकल्पिक)
(डी) एक पदावनत (डिफ़ॉल्ट रूप से सक्षम)
(एस) एक गंभीर चेतावनी (सक्षम)
मैंने कुछ चेतावनियों वाले संदेशों को सूचीबद्ध किया है जो वर्गीकरण के द्वारा अक्सर नीचे आते हैं। उनके बारे में विस्तृत जानकारी के लिए और अन्य संदेश पेर्लिग का संदर्भ देते हैं
(डब्ल्यू) एक चेतावनी (वैकल्पिक):
% S में
मिसिंग तर्क -% c से मिसिंग तर्क -
(क्या आपका मतलब है और इसके बजाय% s?)
(क्या "हमारा" के बजाय "स्थानीय" का अर्थ है?)
(क्या आप% के बजाय $ या @ का मतलब है?)
'% S '
% s
मिसप्लाज्ड _ पर संख्या में प्रयुक्त कोड संदर्भ लंबाई () नहीं है
(डी) एक वेतन वृद्धि (डिफ़ॉल्ट रूप से सक्षम):
परिभाषित (@array) पदावनत
परिभाषित है (% हैश) पदावनत
है मेरा () गलत डिप्रेस्ड
$ में # का उपयोग अब समर्थित नहीं है
(एस) एक गंभीर चेतावनी (डिफ़ॉल्ट रूप से सक्षम)
ओईनिफ़ को एलीसिफ़
% s मिल जाना चाहिए जहाँ ऑपरेटर को उम्मीद थी
(% s से पहले मिसिंग ऑपरेटर?)
(पिछली पंक्ति पर
अर्धविराम की कमी ?)
% s ने कभी भी
ऑपरेटर या अर्धविराम नहीं पेश किया जो % s से पहले गायब हो गया है।
समस्या: खुला% ओपन होना चाहिए (% s)
प्रोटोटाइप बेमेल:% s बनाम% s
चेतावनी: कोष्ठक के बिना "% s" का उपयोग अस्पष्ट है,
% s नहीं खोल सकता:% s
use loose;