কেন কঠোর এবং সতর্কতা ব্যবহার করবেন?


104

আমার কাছে মনে হচ্ছে পার্ল ট্যাগের অনেকগুলি প্রশ্নের সমাধান করা যেতে পারে যদি লোকেরা ব্যবহার করে:

use strict;
use warnings;

আমি মনে করি কিছু লোক এগুলিকে প্রশিক্ষণের চাকার সাথে অযৌক্তিক জটিলতা বা অপ্রয়োজনীয় জটিলতাগুলির মতো বলে মনে করে, যা স্পষ্টভাবে সত্য নয়, এমনকি খুব দক্ষ পার্ল প্রোগ্রামাররা এগুলি ব্যবহার করে।

দেখে মনে হচ্ছে পার্লে দক্ষ যারা বেশিরভাগ লোকেরা সবসময় এই দুটি প্রগমা ব্যবহার করেন, তবে যারা এগুলি ব্যবহার করে সবচেয়ে বেশি উপকৃত হন তারা খুব কমই করেন। সুতরাং, আমি ভেবেছিলাম যে লোকেদের use strictএবং সেখানে উত্সাহিত করার সময় লিঙ্ক করার জন্য একটি প্রশ্ন থাকা ভাল ধারণা হবে warnings

তাহলে, কেন পার্ল বিকাশকারী use strictএবং warnings?


14
আমি সর্বদা এই জাতীয় জিনিসগুলির জন্য আশ্চর্য হই যে কেন তারা কেবল এটি ডিফল্ট করে না এবং দেবকে আসলে সক্রিয়ভাবে জিনিসগুলি আলগা করতে হয়, কোথায়use loose;
পল টাইং

12
পার্ক হ্যাক হিসাবে শুরু হয়েছিল এমন অনেক দুর্দান্ত এবং দরকারী জিনিসের মতো, যিনি এটি আবিষ্কার করেছেন তার হাতিয়ার হিসাবে। পরে এটি আরও জনপ্রিয় হয়ে ওঠে এবং ক্রমবর্ধমান সংখ্যক দক্ষ লোক এটি ব্যবহার শুরু করে। আপনি যখন এমন কিছু ভাবতে শুরু করেন use strictএটি একটি ভাল ধারণা ছিল তবে পিছনের দিকের সামঞ্জস্যতা ইতিমধ্যে আপনার কাছে একটি সত্যিকারের সমস্যা হয়ে দাঁড়িয়েছে :-(
ড্যানিয়েল বোহ্মার

14
use strict;আপনি যখন পার্ল 5.12 (বা ততোধিক ) ভাষার জন্য অনুরোধ করবেন তখন @ জেবি নিজেট, @ পল টি। আসলে, ডিফল্টরূপে চালু থাকে। ব্যবহার করে দেখুন perl -e"use v5.012; $x=123;"no strict;আসলে এটি বন্ধ করে দেয়।
ইকগামি

1
যদিও আপনার বক্তব্যটি সত্য, তত বেশিবার আমরা এটি বলব, সম্ভবত আরও লোকেরা শুনতে পাবে। আরও / আরও ভাল / আধুনিক পার্ল টিউটোরিয়ালগুলি উপলভ্য করার চেষ্টা করতে ইদানীং কিছুটা দৌড়ঝাঁপ হয়েছে এবং অবশ্যই এর প্রতিটিটির শীর্ষে কঠোর / সতর্কতা থাকবে। আমার জন্য আমি প্রতিটি স্নিপেটের শীর্ষে এস / ডাব্লু রাখার পরিকল্পনা করছি, যাতে সমস্ত নবাগত ব্যক্তি এটি প্রতিবার দেখতে পান
জোয়েল বার্গার

5
@ জোয়েলবার্গার না, আসলে এটি এর মতো কিছুই নয়। ঠিক যেমনটি আমি বলেছিলাম, এর শিরোনামে কেবল একই শব্দ রয়েছে। এটি পিছনের সামঞ্জস্যের জন্য। গৃহীত উত্তরের প্রথম বাক্যটি কীভাবে, আপনি কীভাবে আমার প্রশ্নের সাথে প্রযোজ্য?
টিএলপি

উত্তর:


83

প্রারম্ভিকদের জন্য, use strict;(এবং কিছুটা হলেও use warnings;) পরিবর্তনশীল নামে টাইপগুলি খুঁজে পেতে সহায়তা করে। এমনকি অভিজ্ঞ প্রোগ্রামাররা এ জাতীয় ত্রুটি করে। একটি সাধারণ কেস কোড পরিষ্কার বা রিফ্যাক্টরিং করার সময় কোনও ভেরিয়েবলের একটি উদাহরণটির পুনরায় নামকরণ করতে ভুলে যায়।

use strict; use warnings;অন্যথায় ধরা পড়ার আগে যত তাড়াতাড়ি অনেকগুলি ত্রুটি ধরা পড়েছে তা ব্যবহার করা ত্রুটিগুলির মূল কারণগুলি খুঁজে পাওয়া সহজ করে। মূল কারণটি একটি ত্রুটি বা বৈধতা যাচাইয়ের প্রয়োজন হতে পারে এবং এটি নির্বিশেষে বা প্রোগ্রামার দক্ষতা হতে পারে।

পার্ল সতর্কতাগুলির মধ্যে ভাল এটি হ'ল এগুলি খুব কমই উত্সাহিত হয়, তাই এগুলি ব্যবহার করার কোনও মূল্য নেই।


সম্পর্কিত পড়া: কেন ব্যবহার my?


2
@ টিএলপি, এটি কতটা সহায়তা করে তা পরিমাপ করার জন্য আমি কোনও গবেষণা করতে যাচ্ছি না। এগুলি বলার অপেক্ষা রাখে না যে তারা নিঃশর্ত সহায়তা করে।
ইকেগামি

1
কেন এটি alচ্ছিক করা হয় যদি এর এত সুবিধা থাকে? কেন এটি ডিফল্টরূপে সক্ষম করা হয়নি (যেমন উপরে কেউ মন্তব্য করেছেন)? এটি কি সামঞ্জস্যতার কারণে?
জিন

4
@ জিন, পিছনের সামঞ্জস্য। নোটটি use strict;ডিফল্টরূপে সক্ষম করা হয়েছে যদি আপনি সংস্করণ 5.12 বা ভাষার নতুন ভাষা ( use 5.012;) ব্যবহার করেন।
ইকেগামি

@ জিন আপনি যদি কোনও সাধারণ স্ক্রিপ্ট লিখছেন তবে আপনি ফাইল হ্যান্ডলার নামগুলি সম্পর্কে সতর্কতা দ্বারা বা ভেরিয়েবলটি ব্যবহার না করার আগে তাদের ঘোষণার জন্য সতর্কতা পেতে চান না :-)
ইউজার 2676847

28

স্পষ্টতই 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


10

এই দুটি প্রগমাস স্বয়ংক্রিয়ভাবে আপনার কোডগুলিতে বাগগুলি সনাক্ত করতে পারে।

আমি সর্বদা এটি আমার কোডে ব্যবহার করি:

use strict;
use warnings FATAL => 'all';

FATALকোডটি সতর্কতার উপরে মারা যায়, ঠিক তেমন strictকরে।

অতিরিক্ত তথ্যের জন্য, দেখুন: ব্যবহারের সতর্কতাগুলির সাথে আরও কঠোর হন FATAL => 'সমস্ত';

এছাড়াও ... কঠোরতা, সিউসের মতে


প্রকৃতপক্ষে, আপনাকে FATAL => "all"রানটাইম $SIG{__WARN__} = sub { croak "fatalized warning @_" };অবধি বিলম্ব করতে হবে , বরাদ্দ করে অথবা অন্যথায় আপনি কী প্রয়োজন তা আপনাকে জানানোর চেষ্টা করে আপনি সংকলকটি স্ক্রু আপ করে ফেলেন।
tchrist

6
@ ট্রিচ্রিস্ট: এটি সর্বদা যেমন রয়েছে তেমন এবং দলিল হিসাবে আমার পক্ষে কাজ করেছে। যদি আপনি এমন কোনও মামলা খুঁজে পেয়েছেন যেখানে ডকুমেন্ট হিসাবে এটি কাজ করে না, দয়া করে ডকুমেন্টেশনটি প্যাচ করুন perlbug
হাতিয়ার

9

আছে perlmonks একটি ভাল থ্রেড এই তর্কের।

স্পষ্টতই মূল কারণ হ'ল কঠোর এবং সতর্কতাগুলি আপনাকে ভুল এবং সহায়তা ডিবাগিং ধরতে ব্যাপকভাবে সহায়তা করে।


3

সূত্র :: বিভিন্ন ব্লগ

ব্যবহার মডিউল আমদানি () ফাংশন কল করে মূল নেমস্পেসে ফাংশন এবং পরিবর্তনশীল নামগুলি রফতানি করবে।

একটি প্রগমা হল একটি মডিউল যা পার্লের সংকলন সময় বা রান টাইম আচরণের কিছু দিককে প্রভাবিত করে ra প্রাগমাস সংকলককে ইঙ্গিত দেয়।

সতর্কতা ব্যবহার করুন - শুধুমাত্র একবার ব্যবহার করা চলকগুলি সম্পর্কে পার্ল অভিযোগ, স্ট্রিংগুলিকে সংখ্যায় রূপান্তরিত করা।। খোলা নেই এমন ফাইলগুলিতে লেখার চেষ্টা করা it এটি সংকলন সময়ে ঘটে .এটি সতর্কতাগুলি নিয়ন্ত্রণ করতে ব্যবহৃত হয়।

কঠোরভাবে ব্যবহার করুন - ভেরিয়েবলের সুযোগ ঘোষণা করুন। এটি স্ক্রিপ্টে কিছু প্রকারের শৃঙ্খলা সেট করতে ব্যবহৃত হয় bare যদি নরওয়ার্ডগুলি কোড ব্যাখ্যা করা হয় তবে তাদের ব্যবহারযোগ্য। সমস্ত ভেরিয়েবলগুলি আমার, আমাদের বা স্থানীয়ের মতো সুযোগ দেওয়া উচিত।


1

"কঠোরভাবে ব্যবহার করুন" নির্দেশিকা পার্লকে আপনার কোডটি সংকলনের সময় অতিরিক্ত চেকিং করতে বলে। এই নির্দেশিকাটি ব্যবহার করা আপনার পার্ল কোডটি ডিবাগ করার সময় বাঁচায় কারণ এটি সাধারণ কোডিং বাগগুলি খুঁজে পেয়েছে যা আপনি অন্যথায় উপেক্ষা করতে পারেন।


0

কঠোর এবং সতর্কতাগুলি নিশ্চিত করে যে আপনার ভেরিয়েবলগুলি বৈশ্বিক নয়।

প্রতিটি ভেরিয়েবলের নাম রাখার পরিবর্তে স্বতন্ত্র পদ্ধতির জন্য ভেরিয়েবলগুলি অনন্য রাখতে সক্ষম হওয়া অনেক বেশি পরিষ্কার is

$ _, বা নির্দিষ্ট ফাংশনগুলির জন্য কোনও ভেরিয়েবল, আরও কমপ্যাক্ট কোডটি আরও দ্রুত লেখার জন্য দরকারী।

তবে, আপনি যদি কঠোর এবং সতর্কতা ব্যবহার না করেন তবে $ _ গ্লোবাল হয়ে যায়!


0
use strict;
use warnings;

কঠোর এবং সতর্কতাগুলি পার্ল প্রোগ্রামের মোড। এটি ব্যবহারকারীকে কোডটি আরও উদারভাবে এবং তার চেয়ে বেশি প্রবেশ করতে দিচ্ছে, সেই পার্ল কোডটি আনুষ্ঠানিক দেখায় এবং এর কোডিং মান কার্যকর হবে।

সতর্কতাগুলির অর্থ -wপার্ল শেবাং লাইনের মতোই , সুতরাং এটি আপনাকে পার্ল প্রোগ্রাম দ্বারা উত্পন্ন সতর্কতা সরবরাহ করবে, এটি টার্মিনাল প্রদর্শন করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.