স্পষ্টতই use strict
(অবশ্যই) ব্যবহার করা উচিত যখন আপনি কোডটি পার্লকে সঠিকভাবে জোর করতে চান যা ডিক্লোরেশন বাধ্যতামূলক করতে পারে, স্ট্রিং এবং সাব অর্থাৎ স্পষ্টতই বেনওয়ারওয়ার্ডে স্পষ্ট হওয়া বা সতর্কতার সাথে রেফ ব্যবহার করা উচিত। দ্রষ্টব্য: যদি ত্রুটিগুলি থাকে তবে ব্যবহারটি কঠোর হলে ব্যবহার কার্যকর করা বাতিল করতে হবে।
আপনি যখন use warnings;
কোনও সেমিকোলন মিস করেছেন, আপনি 'এলসিফ' ব্যবহার করেছেন এবং 'এলসিফ' ব্যবহার না করে আপনি প্রোগ্রামটিতে টাইপিং ভুলগুলি খুঁজে পেতে সহায়তা করবেন, আপনি যেমন হ'ল অবহিত বাক্য গঠন বা ফাংশন ব্যবহার করছেন।দ্রষ্টব্য: ব্যবহারের সতর্কতাগুলি কেবলমাত্র সতর্কতা সরবরাহ করে এবং কার্যকর করা চালিয়ে যায় অর্থাত্ মৃত্যুদণ্ড বাতিল করে দেয় ..
যাইহোক, আমরা বিশদে যা নিচে নির্দিষ্ট করে দিচ্ছি সেটাই ভাল হবে
থেকে perl.com (আমার প্রিয়):
কঠোর 'vars' ব্যবহার;
যার অর্থ হল আপনার ব্যবহারের আগে আপনার অবশ্যই সর্বদা ভেরিয়েবল ঘোষণা করতে হবে।
আপনি যদি ঘোষণা না করেন তবে আপনি সম্ভবত অঘোষিত ভেরিয়েবলের জন্য ত্রুটি বার্তা পাবেন
গ্লোবাল প্রতীক "$ ভেরিয়েবলনাম" এর জন্য স্ক্রিপ্টনাম.পিএল লাইন 3 এ সুস্পষ্ট প্যাকেজের নাম প্রয়োজন
এই সতর্কতার অর্থ পার্ল ভেরিয়েবলের সুযোগ কী তা সম্পর্কে ঠিক পরিষ্কার নয়। সুতরাং আপনার আপনার ভেরিয়েবলগুলি সম্পর্কে স্পষ্ট হওয়া দরকার, যার অর্থ হয় সেগুলি দিয়ে ঘোষণা করাmy
ব্লকের যাতে তারা বর্তমান ব্লকের মধ্যে সীমাবদ্ধ থাকে বা তাদের পুরোপুরি যোগ্য নামের সাথে উল্লেখ করে (যেমন: $ মেইন :: ভেরিয়েবলের নাম)।
সুতরাং, যদি আপনি নিম্নোক্ত মানদণ্ডগুলির মধ্যে কমপক্ষে কোনও একটি পূরণ না করে এমন একটি ভেরিয়েবল অ্যাক্সেস করার চেষ্টা করেন তবে একটি সংকলন-সময় ত্রুটি ট্রিগার করা হয়েছে:
পার্ল নিজেই পূর্বনির্ধারিত, যেমন @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
উভয় ক্ষেত্রেই আমাদের একটি টেস্ট_ভ্যালু () সাব আছে এবং আমরা এর ফলাফলটি $ এতে রাখতে চাই। এবং তবুও, যখন আমরা দুটি প্রোগ্রাম পরিচালনা করি, তখন আমরা দুটি ভিন্ন ফলাফল পাই:
প্রথম প্রোগ্রামে, আমরা যে বিন্দুতে $a = test_value;
পৌঁছলাম, পার্ল কোনও টেস্ট_ভ্যালু () সাব সম্পর্কে জানে না এবং টেস্ট_ভ্যালুটি স্ট্রিংকে 'টেস্ট_ভ্যালু' হিসাবে ব্যাখ্যা করা হয়। দ্বিতীয় প্রোগ্রামে, টেস্ট_ভ্যালু () এর সংজ্ঞাটি $a = test_value;
লাইনের আগে আসে । পার্ল টেস্ট_ভ্যালুটিকে সাব কল হিসাবে ভাবেন।
টেস্ট_ভ্যালু এর মতো বিচ্ছিন্ন শব্দের জন্য প্রযুক্তিগত শব্দটি উপ-শব্দ হতে পারে এবং প্রসঙ্গের ভিত্তিতে স্ট্রিং হতে পারে, উপায় দ্বারা, খালি শব্দ । পার্লের বেয়ারওয়ার্ডগুলি পরিচালনা করা বিভ্রান্তিকর হতে পারে এবং এটি প্রোগ্রামে বাগ তৈরি করতে পারে।
বাগটি আমরা আমাদের প্রথম প্রোগ্রামটিতে যা করেছি তা মনে রাখবেন, পার্ল test_value()
সন্ধানের অপেক্ষায় থাকবে না , সুতরাং যেহেতু এটি ইতিমধ্যে টেস্ট_ভ্যালু () দেখেনি, এটি ধরে নিয়েছে যে আপনি একটি স্ট্রিং চান। আপনি যদি তাই হন তবে use strict subs;
এই প্রোগ্রামটি একটি ত্রুটির সাথে মারা যাবে:
বেয়ারওয়ার্ড "টেস্ট_ভ্যালু" অনুমোদিত নয় তবে "কড়া সাবস্ক্রাইব"। /A6-sturubs.pl লাইন 3 এ ব্যবহৃত হয়।
এই ত্রুটির সমাধান হবে
১. বন্ধ করার জন্য বন্ধনী ব্যবহার করুন এটি স্পষ্ট করতে যে আপনি কোনও সাব কল করছেন। পার্ল যদি $ a = test_value () ;,; দেখেন
তবে আপনি প্রথমে আপনার সাবটি ব্যবহারের আগে এটি ঘোষণা করুন
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"; }
৩. এবং যদি আপনি এটি স্ট্রিং হিসাবে ব্যবহার করতে চান তবে এটিকে উদ্ধৃত করুন।
সুতরাং, এই কঠোরতা পার্লকে সমস্ত খালি শব্দকে সিনট্যাক্স ত্রুটি হিসাবে গণ্য করে। * একটি খালি শব্দ এমন কোনও খালি নাম বা শনাক্তকারী যা প্রসঙ্গ দ্বারা বাধ্যতামূলক অন্য কোনও ব্যাখ্যা নেই। (প্রসঙ্গটি প্রায়শই নিকটবর্তী কীওয়ার্ড বা টোকেন দ্বারা, বা প্রশ্নে শব্দটির পূর্বানুমতি দ্বারা জোর করা হয়) বা বন্ধনী ব্যবহার করুন।
অপ্রত্যাশিত আচরণের কারণে বেয়ারওয়ার্ডগুলি বিপজ্জনক। 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
প্রগমা ব্যবহার করে নিয়ন্ত্রণ করা যায় ।
(ডাব্লু) একটি সতর্কতা (alচ্ছিক)
(ডি) একটি অবমূল্যায়ন (ডিফল্ট দ্বারা সক্ষম)
(এস) একটি গুরুতর সতর্কতা (ডিফল্টরূপে সক্ষম)
আমি নীচে শ্রেণিবদ্ধকরণের দ্বারা সংঘটিত কিছু সতর্কতা বার্তা তালিকাভুক্ত করেছি। তাদের এবং অন্যান্য বার্তাগুলির বিশদ তথ্যের জন্য পার্লাদিগ উল্লেখ করুন
(ডাব্লু) একটি সতর্কতা (alচ্ছিক):
%
S-তে আর্গুমেন্ট অনুপস্থিত -% c
(আপনি কি এর পরিবর্তে &% s বলতে চাইছেন?)
(আপনার "আমাদের" এর পরিবর্তে "স্থানীয়" কি বোঝানো হয়েছে ?) ( % এর পরিবর্তে
আপনার কি $ বা @ এর অর্থ?)
'% S 'কোনও কোড রেফারেন্স
দৈর্ঘ্য নয় ()% s
ভুল জায়গায় _ সংখ্যায় ব্যবহৃত হয়
(ডি) একটি অবচয় (ডিফল্টরূপে সক্ষম):
সংজ্ঞায়িত (@ অ্যারে) হ্রাস করা হয়েছে
সংজ্ঞায়িত (% হ্যাশ)
হ্রাস করা হয়েছে মিথ্যা শর্তাধীন আমার () এর অবচয় ব্যবহার re
# আর সমর্থিত নয়
(এস) একটি কঠোর সতর্কতা (ডিফল্টরূপে সক্ষম)
অপরদিকে
অপারেটর প্রত্যাশিত যেখানে এলসিফ % s পাওয়া উচিত
(% s এর আগে অপারেটর অনুপস্থিত?)
(আগের লাইনে সেমিকোলন অনুপস্থিত?)
% s কখনই
% s এর আগে অপারেটর বা সেমিকোলন অনুপস্থিত পরিচয় দেয় না
অগ্রাধিকার সমস্যা: খোলা% s খোলা থাকতে হবে (% s)
প্রোটোটাইপ মেলেনি:% s বনাম% s
সতর্কতা: প্রথম বন্ধনী ছাড়াই "% s" ব্যবহার অস্পষ্ট,
% s খুলতে পারে না:% s
use loose;