Amazon Best VPN GoSearch

অনওয়ার্কস ফেভিকন

perlobj - ক্লাউডে অনলাইন

উবুন্টু অনলাইন, ফেডোরা অনলাইন, উইন্ডোজ অনলাইন এমুলেটর বা MAC OS অনলাইন এমুলেটরের মাধ্যমে OnWorks ফ্রি হোস্টিং প্রদানকারীতে perlobj চালান

এটি হল perlobj কমান্ড যা আমাদের একাধিক বিনামূল্যের অনলাইন ওয়ার্কস্টেশন যেমন উবুন্টু অনলাইন, ফেডোরা অনলাইন, উইন্ডোজ অনলাইন এমুলেটর বা MAC OS অনলাইন এমুলেটর ব্যবহার করে OnWorks ফ্রি হোস্টিং প্রদানকারীতে চালানো যেতে পারে।

কার্যক্রম:

NAME এর


perlobj - পার্ল বস্তুর উল্লেখ

বর্ণনাঃ


এই নথিটি পার্লের অবজেক্ট ওরিয়েন্টেশন বৈশিষ্ট্যগুলির জন্য একটি রেফারেন্স প্রদান করে। আপনি যদি
পার্লে অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের একটি ভূমিকা খুঁজছেন, অনুগ্রহ করে perlootut দেখুন।

পার্ল অবজেক্টগুলি বোঝার জন্য, আপনাকে প্রথমে পার্লের রেফারেন্সগুলি বুঝতে হবে। দেখা
বিস্তারিত জানার জন্য perlref.

এই নথিটি পার্লের সমস্ত অবজেক্ট-ওরিয়েন্টেড (OO) বৈশিষ্ট্যগুলিকে গ্রাউন্ড আপ থেকে বর্ণনা করে। যদি
আপনি শুধু আপনার নিজস্ব কিছু বস্তু-ভিত্তিক কোড লিখতে খুঁজছেন, আপনি সম্ভবত
perlootut এ বর্ণিত CPAN থেকে অবজেক্ট সিস্টেমগুলির একটি ব্যবহার করে ভালভাবে পরিবেশন করা হয়।

আপনি যদি আপনার নিজস্ব অবজেক্ট সিস্টেম লিখতে চান, বা আপনাকে কোড বজায় রাখতে হবে যা
স্ক্র্যাচ থেকে বস্তু প্রয়োগ করে তাহলে এই নথিটি আপনাকে ঠিক কিভাবে বুঝতে সাহায্য করবে
পার্ল অবজেক্ট ওরিয়েন্টেশন করে।

কিছু মৌলিক নীতি রয়েছে যা অবজেক্ট ওরিয়েন্টেড পার্লকে সংজ্ঞায়িত করে:

1. একটি বস্তু কেবল একটি ডেটা কাঠামো যা জানে যে এটি কোন শ্রেণীর অন্তর্গত।

2. একটি ক্লাস কেবল একটি প্যাকেজ। একটি ক্লাস এমন পদ্ধতি সরবরাহ করে যা কাজ করার আশা করে
অবজেক্ট।

3. একটি পদ্ধতি হল একটি সাবরুটিন যা একটি বস্তুর (বা একটি প্যাকেজ) একটি রেফারেন্স আশা করে
নাম, ক্লাস পদ্ধতির জন্য) প্রথম যুক্তি হিসাবে।

আসুন এই নীতিগুলির প্রতিটিকে গভীরভাবে দেখি।

An উদ্দেশ্য is কেবল a উপাত্ত গঠন
বস্তুর অভিযোজন সমর্থনকারী অন্যান্য অনেক ভাষার বিপরীতে, পার্ল কোনো প্রদান করে না
একটি বস্তু নির্মাণের জন্য বিশেষ সিনট্যাক্স। অবজেক্টগুলি নিছক পার্ল ডেটা স্ট্রাকচার
(হ্যাশ, অ্যারে, স্কেলার, ফাইলহ্যান্ডেল, ইত্যাদি) যা স্পষ্টভাবে একটি সাথে যুক্ত করা হয়েছে
বিশেষ শ্রেণী।

এই স্পষ্ট সংঘটি অন্তর্নির্মিত "আশীর্বাদ" ফাংশন দ্বারা তৈরি করা হয়, যা সাধারণত
এর মধ্যে ব্যবহৃত হয় নির্মাতা ক্লাসের সাবরুটিন।

এখানে একটি সাধারণ কনস্ট্রাক্টর:

প্যাকেজ ফাইল;

সাব নতুন {
আমার $ক্লাস = শিফট;

আশীর্বাদ ফেরত {}, $class;
}

"নতুন" নামটি বিশেষ নয়। আমরা আমাদের কনস্ট্রাক্টরের নাম অন্য কিছু দিতে পারি:

প্যাকেজ ফাইল;

সাব লোড {
আমার $ক্লাস = শিফট;

আশীর্বাদ ফেরত {}, $class;
}

OO মডিউলগুলির জন্য আধুনিক নিয়ম হল সর্বদা "নতুন" এর নাম হিসাবে ব্যবহার করা
কনস্ট্রাক্টর, কিন্তু এটি করার কোন প্রয়োজন নেই। যেকোন সাবরুটিন যা ডেটাকে আশীর্বাদ করে
একটি ক্লাসে কাঠামো পার্লে একটি বৈধ কনস্ট্রাক্টর।

পূর্ববর্তী উদাহরণে, "{}" কোডটি একটি খালি বেনামী হ্যাশের একটি রেফারেন্স তৈরি করে।
"আশীর্বাদ" ফাংশনটি সেই রেফারেন্সটি নেয় এবং হ্যাশটিকে ক্লাসের সাথে সংযুক্ত করে
$শ্রেণী। সবচেয়ে সহজ ক্ষেত্রে, $class ভেরিয়েবলের শেষ পর্যন্ত স্ট্রিং থাকবে
"ফাইল"।

যে ডাটা স্ট্রাকচার হচ্ছে তার রেফারেন্স সংরক্ষণ করতে আমরা একটি ভেরিয়েবল ব্যবহার করতে পারি
আমাদের বস্তু হিসাবে আশীর্বাদ:

সাব নতুন {
আমার $ক্লাস = শিফট;

আমার $self = {};
আশীর্বাদ $self, $class;

ফেরত $self;
}

একবার আমরা $self দ্বারা উল্লেখিত হ্যাশকে আশীর্বাদ করলে আমরা এটিতে কল করার পদ্ধতি শুরু করতে পারি। এই
আপনি যদি নিজস্ব পৃথক পদ্ধতিতে অবজেক্ট ইনিশিয়ালাইজেশন করতে চান তবে দরকারী:

সাব নতুন {
আমার $ক্লাস = শিফট;

আমার $self = {};
আশীর্বাদ $self, $class;

$self->_initialize();

ফেরত $self;
}

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

উল্লেখ্য, তবে (অন্যান্য OO ভাষার মতন) পার্ল নিশ্চিত বা প্রয়োগ করে না
যে কোনো উপায়ে encapsulation. আপনি বস্তু আসলে চান be অস্বচ্ছ আপনি ব্যবস্থা করতে হবে
নিজের জন্য এটি "ইনসাইড-আউট" ব্যবহার সহ বিভিন্ন উপায়ে করা যেতে পারে
বস্তু" বা CPAN থেকে মডিউল।

অবজেক্টস হয় ধন্য; ভেরিয়েবল হয় না

যখন আমরা কিছু আশীর্বাদ করি, তখন আমরা সেই পরিবর্তনশীলকে আশীর্বাদ করি না যার একটি রেফারেন্স রয়েছে
যে জিনিস, না আমরা রেফারেন্স আশীর্বাদ করছি যে পরিবর্তনশীল সঞ্চয়; আমরা আশীর্বাদ করছি
যে জিনিসটি পরিবর্তনশীল বোঝায় (কখনও কখনও হিসাবে পরিচিত রিফ্যারেণ্ট) এটাই সবচেয়ে ভালো
এই কোড দ্বারা প্রদর্শিত:

Scalar::'blessed' ব্যবহার করুন;

আমার $foo = {};
আমার $bar = $foo;

আশীর্বাদ $foo, 'ক্লাস';
মুদ্রণ আশীর্বাদ ($bar) // 'আশীর্বাদ নয়'; # প্রিন্ট "ক্লাস"

$bar = "অন্য কিছু মান";
মুদ্রণ আশীর্বাদ ($bar) // 'আশীর্বাদ নয়'; # প্রিন্ট "আশীর্বাদ নয়"

যখন আমরা একটি পরিবর্তনশীলকে "আশীর্বাদ" বলি, আমরা আসলে অন্তর্নিহিত ডেটা কাঠামোকে আশীর্বাদ করি
যে পরিবর্তনশীল বোঝায়. আমরা রেফারেন্স নিজেই আশীর্বাদ করছি না, না পরিবর্তনশীল
যে রেফারেন্স ধারণ করে. এই কারণেই "blessed( $bar )" কে দ্বিতীয় কলটি ফিরে আসে
মিথ্যা সেই সময়ে $bar আর কোনো বস্তুর রেফারেন্স সংরক্ষণ করে না।

আপনি কখনও কখনও পুরানো বই বা ডকুমেন্টেশন "আশীর্বাদ একটি রেফারেন্স" বা উল্লেখ দেখতে পাবেন
একটি বস্তুকে "ধন্য রেফারেন্স" হিসাবে বর্ণনা করুন, কিন্তু এটি ভুল। এটা রেফারেন্স না
যে একটি বস্তু হিসাবে আশীর্বাদ করা হয়; এটি সেই জিনিস যা রেফারেন্স বোঝায় (অর্থাৎ রেফারেন্ট)।

A শ্রেণী is কেবল a প্যাকেজ
পার্ল ক্লাস সংজ্ঞার জন্য কোন বিশেষ সিনট্যাক্স প্রদান করে না। একটি প্যাকেজ সহজভাবে একটি
ভেরিয়েবল এবং সাবরুটিন ধারণকারী নামস্থান। পার্থক্য শুধু একটা ক্লাসে,
সাবরুটিনগুলি একটি বস্তুর রেফারেন্স বা প্রথম হিসাবে একটি ক্লাসের নাম আশা করতে পারে
যুক্তি. এটি সম্পূর্ণরূপে প্রচলিত বিষয়, তাই একটি ক্লাস উভয় পদ্ধতি এবং থাকতে পারে
সাবরুটিন যা না একটি বস্তু বা শ্রেণীতে কাজ করুন।

প্রতিটি প্যাকেজে @ISA নামে একটি বিশেষ অ্যারে রয়েছে। @ISA অ্যারে এর একটি তালিকা রয়েছে
ক্লাসের প্যারেন্ট ক্লাস, যদি থাকে। এই অ্যারে পরীক্ষা করা হয় যখন পার্ল পদ্ধতি রেজোলিউশন করে,
যা আমরা পরে কভার করব।

ম্যানুয়ালি @ISA সেট করা সম্ভব, এবং আপনি এটি পুরানো পার্ল কোডে দেখতে পারেন। বেশ পুরাতন
কোড বেস প্রাগমা ব্যবহার করে। নতুন কোডের জন্য, আমরা আপনাকে প্যারেন্ট প্র্যাগমা ব্যবহার করার পরামর্শ দিই
আপনার বাবা-মাকে ঘোষণা করতে। এই প্র্যাগমা @ISA সেট করার যত্ন নেবে। এটাও লোড হবে
প্যারেন্ট ক্লাস এবং নিশ্চিত করুন যে প্যাকেজটি নিজের থেকে উত্তরাধিকারসূত্রে পাওয়া যায় না।

যদিও প্যারেন্ট ক্লাস সেট করা আছে, প্যাকেজের @ISA ভেরিয়েবলের একটি তালিকা থাকবে
যারা বাবা. এটি কেবল স্কেলারগুলির একটি তালিকা, যার প্রতিটি একটি স্ট্রিং
একটি প্যাকেজ নামের সাথে মিলে যায়।

সমস্ত শ্রেণী ইউনিভার্সাল ক্লাস থেকে অন্তর্নিহিতভাবে উত্তরাধিকার সূত্রে প্রাপ্ত। ইউনিভার্সাল ক্লাস হয়
পার্ল কোর দ্বারা বাস্তবায়িত, এবং বেশ কিছু ডিফল্ট পদ্ধতি প্রদান করে, যেমন "isa()",
"can()", এবং "VERSION()"। "ইউনিভার্সাল" ক্লাস করবে না একটি প্যাকেজের @ISA-এ উপস্থিত হয়
পরিবর্তনশীল।

পার্ল কেবল একটি অন্তর্নির্মিত বৈশিষ্ট্য হিসাবে পদ্ধতি উত্তরাধিকার প্রদান করে। বৈশিষ্ট্য উত্তরাধিকার হয়
বাস্তবায়নের জন্য ক্লাস ছেড়েছি। বিস্তারিত জানার জন্য "লেখার অ্যাক্সেসরস" বিভাগটি দেখুন।

A পদ্ধতি is কেবল a সাবরুটাইন
পার্ল একটি পদ্ধতি সংজ্ঞায়িত করার জন্য কোন বিশেষ সিনট্যাক্স প্রদান করে না। একটি পদ্ধতি সহজভাবে একটি
নিয়মিত সাবরুটিন, এবং "সাব" দিয়ে ঘোষণা করা হয়। কি একটি পদ্ধতি বিশেষ করে তোলে তা হল
তার প্রথম যুক্তি হিসাবে একটি বস্তু বা একটি শ্রেণীর নাম প্রাপ্ত করার আশা করে।

পার্ল না পদ্ধতি আহ্বানের জন্য বিশেষ সিনট্যাক্স প্রদান করুন, "->" অপারেটর। আমরা কভার করব
এই পরে আরো বিস্তারিত.

আপনার লেখা বেশিরভাগ পদ্ধতি অবজেক্টে কাজ করার আশা করবে:

সাব সেভ {
আমার $self = শিফট;

আমার $fh খুলুন, '>', $self->path() অথবা die $!;
প্রিন্ট করুন {$fh} $self->data() or die $!;
$fh বন্ধ করুন অথবা $ মারা যান!;
}

পদ্ধতি আবাহন
একটি বস্তুর উপর একটি পদ্ধতি কল করা "$object->method" হিসাবে লেখা হয়।

মেথড ইনভোকেশন (বা তীর) অপারেটরের বাম দিকে হল অবজেক্ট (বা ক্লাস
নাম), এবং ডানদিকে পদ্ধতির নাম।

আমার $pod = ফাইল->নতুন ('perlobj.pod', $data);
$pod->সংরক্ষণ();

একটি রেফারেন্স ডিরেফারেন্স করার সময় "->" সিনট্যাক্স ব্যবহার করা হয়। এটা একই মত দেখায়
অপারেটর, কিন্তু এই দুটি ভিন্ন অপারেশন.

আপনি যখন একটি পদ্ধতি কল করেন, তীরের বাম দিকের জিনিসটি প্রথম হিসাবে পাস হয়
পদ্ধতির যুক্তি। এর মানে যখন আমরা "Critter->new()" বলি, "new()" পদ্ধতি
স্ট্রিং "Critter" এর প্রথম আর্গুমেন্ট হিসাবে গ্রহণ করে। যখন আমরা "$fred->speak()" কল করি, তখন
$fred ভেরিয়েবল "speak()"-এর প্রথম আর্গুমেন্ট হিসেবে পাস করা হয়েছে।

যেকোন পার্ল সাবরুটিনের মতোই, @_ এ পাস করা সমস্ত আর্গুমেন্ট হল উপনাম
মূল যুক্তি। এই বস্তু নিজেই অন্তর্ভুক্ত. আপনি যদি সরাসরি $__[0]-কে বরাদ্দ করেন
বস্তুর রেফারেন্স ধারণ করে এমন ভেরিয়েবলের বিষয়বস্তু পরিবর্তন করবে। আমরা
আপনি ঠিক কি করছেন তা না জানলে আপনি এটি করবেন না বলে সুপারিশ করুন।

পার্ল তীরের বাম দিকের দিকে তাকিয়ে পদ্ধতিটি কোন প্যাকেজটিতে রয়েছে তা জানে৷ যদি
বাম দিকে একটি প্যাকেজের নাম, এটি সেই প্যাকেজের পদ্ধতিটি সন্ধান করে। বাম হলে
হ্যান্ড সাইড একটি অবজেক্ট, তারপর পার্ল বস্তুটির প্যাকেজে পদ্ধতিটি সন্ধান করে
মধ্যে আশীর্বাদ করা হয়েছে.

যদি বাম দিকে একটি প্যাকেজ নাম বা একটি বস্তু না হয়, তারপর পদ্ধতি কল হবে
একটি ত্রুটি ঘটান, কিন্তু আরও সূক্ষ্মতার জন্য "পদ্ধতি কল বৈচিত্র" এর বিভাগটি দেখুন।

উত্তরাধিকার
আমরা ইতিমধ্যেই বিশেষ @ISA অ্যারে এবং প্যারেন্ট প্র্যাগমা সম্পর্কে কথা বলেছি।

যখন একটি শ্রেণী অন্য শ্রেণী থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়, তখন অভিভাবক শ্রেণীতে সংজ্ঞায়িত যেকোন পদ্ধতি
শিশু শ্রেণীর জন্য উপলব্ধ। আপনি যদি এমন একটি বস্তুর উপর একটি পদ্ধতি কল করার চেষ্টা করেন যা নয়
নিজস্ব শ্রেণীতে সংজ্ঞায়িত, পার্ল যে কোনও অভিভাবক ক্লাসে সেই পদ্ধতিটিও সন্ধান করবে
আছে।

প্যাকেজ ফাইল::MP3;
প্যারেন্ট 'ফাইল' ব্যবহার করুন; # সেট @File::MP3::ISA = ('ফাইল');

আমার $mp3 = ফাইল::MP3->নতুন ('Andvari.mp3', $data);
$mp3->সংরক্ষণ();

যেহেতু আমরা "ফাইল::MP3" ক্লাসে একটি "সংরক্ষণ()" পদ্ধতি সংজ্ঞায়িত করিনি, তাই পার্ল দেখবে
"Save()" মেথড খুঁজে পেতে "ফাইল::MP3" ক্লাসের প্যারেন্ট ক্লাস। যদি পার্ল খুঁজে না পায় a
"save()" মেথড ইনহেরিটেন্স হায়ারার্কির যে কোন জায়গায় থাকলে, এটি মারা যাবে।

এই ক্ষেত্রে, এটি "ফাইল" ক্লাসে একটি "সংরক্ষণ()" পদ্ধতি খুঁজে পায়। লক্ষ্য করুন যে বস্তুটি পাস হয়েছে
এই ক্ষেত্রে "সংরক্ষণ()" এখনও একটি "ফাইল::এমপি 3" অবজেক্ট, যদিও পদ্ধতিটি পাওয়া যায়
"ফাইল" ক্লাস।

আমরা চাইল্ড ক্লাসে অভিভাবকদের পদ্ধতিকে ওভাররাইড করতে পারি। যখন আমরা তা করি, আমরা এখনও কল করতে পারি
"সুপার" ছদ্ম-শ্রেণীর সাথে অভিভাবক শ্রেণীর পদ্ধতি।

সাব সেভ {
আমার $self = শিফট;

'রক করার জন্য প্রস্তুত' বলুন;
$self->সুপার::সেভ();
}

"সুপার" মডিফায়ার পারে কেবল পদ্ধতি কলের জন্য ব্যবহার করা হবে। আপনি এটি নিয়মিত ব্যবহার করতে পারবেন না
সাবরুটিন কল বা ক্লাস পদ্ধতি:

সুপার::সেভ($thing); # ব্যর্থ: SUPER প্যাকেজে save() সাব খুঁজছে

সুপার->সংরক্ষণ ($ জিনিস); # ব্যর্থ: ক্লাসে save() পদ্ধতির সন্ধান করে
# সুপার

$thing->সুপার::সেভ(); # ঠিক আছে: পিতামাতার মধ্যে save() পদ্ধতির সন্ধান করে
#টি ক্লাস

কিভাবে সুপার is স্থিরপ্রতিজ্ঞ

"সুপার" সিউডো-ক্লাসটি প্যাকেজ থেকে সমাধান করা হয়েছে যেখানে কল করা হয়েছে। এইটা না
অবজেক্টের ক্লাসের উপর ভিত্তি করে সমাধান করা হয়েছে। এটি গুরুত্বপূর্ণ, কারণ এটি পদ্ধতিগুলিকে অনুমতি দেয়
একটি গভীর উত্তরাধিকার অনুক্রমের মধ্যে বিভিন্ন স্তর প্রতিটি সঠিকভাবে তাদের নিজ নিজ কল
অভিভাবক পদ্ধতি।

প্যাকেজ A;

সাব নতুন {
ফিরে আশীর্বাদ {}, শিফট;
}

সাব কথা {
আমার $self = শিফট;

'ক' বলুন;
}

প্যাকেজ বি;

parent-norequire, 'A' ব্যবহার করুন;

সাব কথা {
আমার $self = শিফট;

$self->সুপার::স্পিক();

'বি' বলুন;
}

প্যাকেজ সি;

parent-norequire, 'B' ব্যবহার করুন;

সাব কথা {
আমার $self = শিফট;

$self->সুপার::স্পিক();

'সি' বলুন;
}

আমার $c = C->নতুন();
$c->বলো();

এই উদাহরণে, আমরা নিম্নলিখিত আউটপুট পাব:

A
B
C

এটি দেখায় কিভাবে "সুপার" সমাধান করা হয়। যদিও বস্তুটি "C" তে আশীর্বাদ করা হয়
ক্লাস, "বি" ক্লাসের "স্পিক()" পদ্ধতিটি এখনও "সুপার::স্পেক()" কল করতে পারে এবং এটি আশা করতে পারে
সঠিকভাবে "B" এর প্যারেন্ট ক্লাসে দেখতে (অর্থাৎ যে ক্লাসে মেথড কল আছে), এর মধ্যে নয়
"C" এর মূল শ্রেণী (অর্থাৎ বস্তুটি যে শ্রেণীতে)

এই প্যাকেজ-ভিত্তিক রেজোলিউশন একটি সমস্যা হতে পারে যেখানে বিরল ক্ষেত্রে আছে. কপি করলে ক
এক প্যাকেজ থেকে অন্য প্যাকেজে সাবরুটিন, "সুপার" রেজোলিউশনের উপর ভিত্তি করে করা হবে
মূল প্যাকেজ।

বহু উত্তরাধিকার

একাধিক উত্তরাধিকার প্রায়ই একটি নকশা সমস্যা নির্দেশ করে, কিন্তু পার্ল সবসময় আপনাকে যথেষ্ট দেয়
যদি আপনি এটি চেয়েছিলেন সঙ্গে নিজেকে ঝুলানো দড়ি.

একাধিক অভিভাবক ঘোষণা করতে, আপনাকে "পিতামাতা ব্যবহার" করতে একাধিক শ্রেণীর নাম পাস করতে হবে:

প্যাকেজ মাল্টিচাইল্ড;

প্যারেন্ট 'Parent1', 'Parent2' ব্যবহার করুন;

পদ্ধতি সমাধান অর্ডার

পদ্ধতির রেজোলিউশন অর্ডার শুধুমাত্র একাধিক উত্তরাধিকারের ক্ষেত্রে গুরুত্বপূর্ণ। এর ব্যাপারে
একক উত্তরাধিকার, পার্ল কেবল একটি পদ্ধতি খুঁজে পেতে উত্তরাধিকার চেইনটি সন্ধান করে:

পিতামহ
|
মাতা
|
শিশু

যদি আমরা একটি "শিশু" বস্তুর উপর একটি পদ্ধতি কল করি এবং সেই পদ্ধতিটি "শিশু" এ সংজ্ঞায়িত না হয়
ক্লাস, পার্ল "পিতামাতা" ক্লাসে সেই পদ্ধতিটি সন্ধান করবে এবং তারপরে, প্রয়োজনে, তে
"দাদা-দাদি" ক্লাস।

যদি পার্ল এই ক্লাসগুলির মধ্যে কোনও পদ্ধতি খুঁজে না পায় তবে এটি একটি ত্রুটি বার্তা দিয়ে মারা যাবে।

যখন একটি ক্লাসে একাধিক অভিভাবক থাকে, তখন পদ্ধতির সন্ধানের ক্রম আরও জটিল হয়ে যায়।

ডিফল্টরূপে, পার্ল একটি পদ্ধতির জন্য একটি গভীরতা-প্রথম বাম-থেকে-ডানে অনুসন্ধান করে। মানে এটা
@ISA অ্যারেতে প্রথম পিতামাতার সাথে শুরু হয়, এবং তারপর তার সমস্ত পিতামাতাকে অনুসন্ধান করে,
দাদা-দাদি ইত্যাদি। যদি এটি পদ্ধতিটি খুঁজে পেতে ব্যর্থ হয়, তবে এটি পরবর্তী পিতামাতার কাছে যায়
মূল ক্লাসের @ISA অ্যারে এবং সেখান থেকে অনুসন্ধান করে।

SharedGreatGrandParent
/
পৈতৃক দাদা-দাদি মা-দাদা-দাদি
\/
বাবা মা
\/
শিশু

সুতরাং উপরের চিত্রটি দেওয়া হয়েছে, পার্ল "শিশু", "বাবা", "পিতাপিতা" অনুসন্ধান করবে
"SharedGreatGrandParent", "মা" এবং অবশেষে "Maternal Grandparent"। এটি একটি হতে পারে
সমস্যা কারণ এখন আমরা "SharedGreatGrandParent" এ খুঁজছি আগে আমরা তার সব চেক করেছি
প্রাপ্ত ক্লাস (অর্থাৎ আমরা "মা" এবং "মাতৃদাদি" চেষ্টা করার আগে)।

mro pragma দিয়ে একটি ভিন্ন পদ্ধতির রেজোলিউশন অর্ডারের জন্য জিজ্ঞাসা করা সম্ভব।

প্যাকেজ শিশু;

mro 'c3' ব্যবহার করুন;
অভিভাবক 'বাবা', 'মা' ব্যবহার করুন;

এই প্র্যাগমা আপনাকে "C3" রেজোলিউশন অর্ডারে স্যুইচ করতে দেয়। সহজ ভাষায়, "C3" অর্ডার
নিশ্চিত করে যে ভাগ করা পিতামাতার ক্লাসগুলি চাইল্ড ক্লাসের আগে কখনও অনুসন্ধান করা হয় না, তাই পার্ল করবে
এখন অনুসন্ধান করুন: "শিশু", "পিতা", "পিতাপিতা", "মা" "মাতৃ-দাদি", এবং
অবশেষে "SharedGreatGrandParent"। তবে মনে রাখবেন যে এটি "প্রস্থ-প্রথম" অনুসন্ধান নয়:
সমস্ত "পিতা" পূর্বপুরুষদের (সাধারণ পূর্বপুরুষ ব্যতীত) যে কোনওটির আগে অনুসন্ধান করা হয়
"মা" পূর্বপুরুষদের বিবেচনা করা হয়।

C3 অর্ডারটি আপনাকে "পরবর্তী" সিউডো-ক্লাস সহ ভাইবোন ক্লাসে পদ্ধতিগুলি কল করতে দেয়।
এই বৈশিষ্ট্য সম্পর্কে আরো বিস্তারিত জানার জন্য mro ডকুমেন্টেশন দেখুন.

পদ্ধতি সমাধান ক্যাশিং

যখন পার্ল একটি পদ্ধতির জন্য অনুসন্ধান করে, তখন এটি লুকআপকে ক্যাশ করে যাতে ভবিষ্যতে এই পদ্ধতিতে কল আসে
এটা আবার অনুসন্ধান করার প্রয়োজন নেই. একটি ক্লাসের প্যারেন্ট ক্লাস পরিবর্তন করা বা সাবরুটিন যোগ করা
একটি ক্লাসে সেই ক্লাসের জন্য ক্যাশে বাতিল হবে।

mro pragma পদ্ধতি ক্যাশে সরাসরি ম্যানিপুলেট করার জন্য কিছু ফাংশন প্রদান করে।

লেখা নির্মাতারা
যেমনটি আমরা আগে উল্লেখ করেছি, পার্ল কোনো বিশেষ কনস্ট্রাক্টর সিনট্যাক্স প্রদান করে না। এর মানে হল যে ক
ক্লাস অবশ্যই তার নিজস্ব কনস্ট্রাক্টর বাস্তবায়ন করবে। একটি কনস্ট্রাক্টর হল একটি ক্লাস পদ্ধতি যা
একটি নতুন বস্তুর একটি রেফারেন্স প্রদান করে।

কনস্ট্রাক্টর অতিরিক্ত পরামিতি গ্রহণ করতে পারে যা বস্তুকে সংজ্ঞায়িত করে। চল লিখি
"ফাইল" ক্লাসের জন্য একটি বাস্তব কনস্ট্রাক্টর যা আমরা আগে ব্যবহার করেছি:

প্যাকেজ ফাইল;

সাব নতুন {
আমার $ক্লাস = শিফট;
আমার ( $পথ, $ডেটা) = @_;

আমার $self = আশীর্বাদ {
পথ => $পথ,
ডেটা => $ডেটা,
}, $class;

ফেরত $self;
}

আপনি দেখতে পাচ্ছেন, আমরা অবজেক্টেই পাথ এবং ফাইল ডেটা সংরক্ষণ করেছি। মনে রাখবেন, অধীনে
ফণা, এই বস্তু এখনও শুধু একটি হ্যাশ. পরে, আমরা ম্যানিপুলেট করার জন্য অ্যাক্সেসর লিখব
এই তথ্য।

আমাদের ফাইল::MP3 ক্লাসের জন্য, আমরা নিশ্চিত করতে পারি যে আমাদের দেওয়া পথটি শেষ হয়েছে
".mp3":

প্যাকেজ ফাইল::MP3;

সাব নতুন {
আমার $ক্লাস = শিফট;
আমার ( $পথ, $ডেটা) = @_;

die "আপনি একটি mp3 এক্সটেনশন ছাড়া একটি ফাইল::MP3 তৈরি করতে পারবেন না\n"
যদি না $path =~ /\.mp3\z/;

ফেরত $class->SUPER::new(@_);
}

এই কনস্ট্রাক্টর তার মূল শ্রেণীকে প্রকৃত বস্তু নির্মাণ করতে দেয়।

আরোপ করা
একটি বৈশিষ্ট্য হল একটি নির্দিষ্ট বস্তুর অন্তর্গত ডেটার একটি অংশ। বেশিরভাগ বস্তুর বিপরীতে-
ওরিয়েন্টেড ল্যাঙ্গুয়েজ, পার্ল ঘোষণা করার জন্য কোন বিশেষ সিনট্যাক্স বা সমর্থন প্রদান করে না
গুণাবলী ম্যানিপুলেট করা

গুণাবলী প্রায়ই বস্তুর মধ্যে সংরক্ষিত হয়. উদাহরণস্বরূপ, যদি বস্তুটি একটি হয়
বেনামী হ্যাশ, আমরা অ্যাট্রিবিউটের নাম হিসাবে ব্যবহার করে হ্যাশে বৈশিষ্ট্যের মান সংরক্ষণ করতে পারি
চাবি.

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

এর বেশ কিছু সুবিধা রয়েছে। অ্যাক্সেসরগুলি একটি এর বাস্তবায়ন পরিবর্তন করা সহজ করে তোলে
আসল API সংরক্ষণ করার সময় অবজেক্ট পরে।

একটি অ্যাক্সেসর আপনাকে অ্যাট্রিবিউট অ্যাক্সেসের চারপাশে অতিরিক্ত কোড যোগ করতে দেয়। উদাহরণস্বরূপ, আপনি পারেন
কনস্ট্রাক্টরে সেট করা হয়নি এমন একটি বৈশিষ্ট্যে একটি ডিফল্ট প্রয়োগ করুন, অথবা আপনি যাচাই করতে পারেন
যে বৈশিষ্ট্যের জন্য একটি নতুন মান গ্রহণযোগ্য।

অবশেষে, অ্যাক্সেসর ব্যবহার করে উত্তরাধিকার অনেক সহজ করে তোলে। সাবক্লাসগুলি অ্যাক্সেসরগুলি ব্যবহার করতে পারে
কিভাবে একটি অভিভাবক শ্রেণী অভ্যন্তরীণভাবে বাস্তবায়িত হয় তা জানার পরিবর্তে।

লেখা অ্যাকসেসর

কনস্ট্রাক্টরগুলির মতো, পার্ল কোনও বিশেষ অ্যাক্সেসর ঘোষণা সিনট্যাক্স প্রদান করে না, তাই ক্লাসগুলি
স্পষ্টভাবে লিখিত অ্যাক্সেসর পদ্ধতি প্রদান করতে হবে। দুটি সাধারণ ধরনের আছে
অ্যাক্সেসর, শুধুমাত্র পঠনযোগ্য এবং পঠন-পাঠন।

একটি সাধারণ পঠনযোগ্য অ্যাক্সেসর কেবল একটি একক বৈশিষ্ট্যের মান পায়:

উপপথ {
আমার $self = শিফট;

ফেরত $self->{পথ};
}

একটি রিড-রাইট অ্যাক্সেসর কলকারীকে মান সেট করার পাশাপাশি এটি পেতে অনুমতি দেবে:

উপপথ {
আমার $self = শিফট;

যদি (@_) {
$self->{পথ} = শিফট;
}

ফেরত $self->{পথ};
}

An সরাইয়া সম্পর্কে দক্ষতা সহকারে এবং নিরাপদ কোড
আমাদের কনস্ট্রাক্টর এবং অ্যাক্সেসররা খুব স্মার্ট নয়। তারা চেক করে না যে একটি $পাথ
সংজ্ঞায়িত, অথবা তারা পরীক্ষা করে না যে $path একটি বৈধ ফাইল সিস্টেম পাথ।

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

পদ্ধতি কল প্রকারভেদ
পার্ল "$object->method()" ব্যবহার ছাড়াও কল করার পদ্ধতিগুলিকে সমর্থন করে
আমরা এ পর্যন্ত দেখেছি।

পদ্ধতি নাম as স্ট্রিং

পার্ল আপনাকে একটি পদ্ধতির নাম হিসাবে একটি স্ট্রিং ধারণকারী একটি স্কেলার ভেরিয়েবল ব্যবহার করতে দেয়:

আমার $file = ফাইল->নতুন ($পথ, $ডেটা);

my $method = 'সংরক্ষণ';
$file->$method();

এটি ঠিক "$file->save()" কল করার মতো কাজ করে। এটি লেখার জন্য খুব দরকারী হতে পারে
গতিশীল কোড। উদাহরণস্বরূপ, এটি আপনাকে প্যারামিটার হিসাবে কল করার জন্য একটি পদ্ধতির নাম পাস করতে দেয়
অন্য পদ্ধতিতে।

শ্রেণী নাম as স্ট্রিং

পার্ল আপনাকে ক্লাসের নাম হিসাবে একটি স্ট্রিং ধারণকারী একটি স্কেলার ব্যবহার করতে দেয়:

my $class = 'ফাইল';

আমার $file = $class->new( $path, $data);

আবার, এটি খুব গতিশীল কোডের জন্য অনুমতি দেয়।

সাবরুটাইন তথ্যসূত্র as পদ্ধতি

আপনি একটি পদ্ধতি হিসাবে একটি সাবরুটিন রেফারেন্স ব্যবহার করতে পারেন:

আমার $sub = sub {
আমার $self = শিফট;

$self->সংরক্ষণ();
};

$file->$sub();

এটি ঠিক "$sub->($file)" লেখার সমতুল্য। আপনি বন্য এই প্রবাদ দেখতে পারেন
"ক্যান" এ কলের সাথে মিলিত:

যদি ( my $meth = $object->can('foo') ) {
$object->$meth();
}

ডিফারেন্সিং পদ্ধতি কল

পার্ল আপনাকে একটি পদ্ধতি কলে একটি ডিরেফারেন্সড স্কেলার রেফারেন্স ব্যবহার করতে দেয়। আমার স্নাতকের
মুখের, তাই কিছু কোড তাকান:

$file->${ \'save' };
$file->${ returns_scalar_ref() };
$file->${ \( returns_scalar() ) };
$file->${ returns_ref_to_sub_ref() };

ডিরেফারেন্স একটি স্ট্রিং তৈরি করলে এটি কাজ করে or একটি সাবরুটিন রেফারেন্স।

পদ্ধতি কল on ফাইলহ্যান্ডেল

হুডের নিচে, পার্ল ফাইলহ্যান্ডেল হল "IO::Handle" বা "IO::File" ক্লাসের উদাহরণ।
একবার আপনার একটি খোলা ফাইলহ্যান্ডেল থাকলে, আপনি এটিতে পদ্ধতিগুলি কল করতে পারেন। উপরন্তু, আপনি কল করতে পারেন
"STDIN", "STDOUT" এবং "STDERR" ফাইলহ্যান্ডেলের পদ্ধতি।

আমার $fh, '>', 'পাথ/টু/ফাইল' খুলুন;
$fh->অটোফ্লাশ();
$fh->মুদ্রণ('সামগ্রী');

STDOUT->অটোফ্লাশ();

invoking শ্রেণী পদ্ধতি
কারণ পার্ল আপনাকে প্যাকেজের নাম এবং সাবরুটিন নামের জন্য বেয়ারওয়ার্ড ব্যবহার করতে দেয়
কখনও কখনও একটি বেয়ারওয়ার্ডের অর্থ ভুলভাবে ব্যাখ্যা করে। উদাহরণস্বরূপ, গঠন
"Class->new()" কে হয় "'Class'->new()" অথবা "Class()->new()" হিসেবে ব্যাখ্যা করা যেতে পারে। ভিতরে
ইংরেজিতে, সেই দ্বিতীয় ব্যাখ্যাটি "নামে একটি সাবরুটিনকে কল করুন।" ক্লাস(), তারপর কল
নতুন() এর রিটার্ন মানের একটি পদ্ধতি হিসাবে ক্লাস()". যদি নামে একটি সাবরুটিন থাকে
বর্তমান নামস্থানে "Class()", পার্ল সর্বদা "Class->new()" কে ব্যাখ্যা করবে
দ্বিতীয় বিকল্প: অবজেক্টে "new()" এ একটি কল "Class()" এ একটি কল দ্বারা ফিরে আসে

আপনি পার্লকে প্রথম ব্যাখ্যাটি ব্যবহার করতে বাধ্য করতে পারেন (যেমন ক্লাসে একটি পদ্ধতি কল হিসাবে
"ক্লাস" নামে) দুটি উপায়ে। প্রথমে, আপনি ক্লাসের নামের সাথে একটি "::" যোগ করতে পারেন:

ক্লাস::->নতুন()

পার্ল সর্বদা এটিকে একটি পদ্ধতি কল হিসাবে ব্যাখ্যা করবে।

বিকল্পভাবে, আপনি ক্লাসের নাম উদ্ধৃত করতে পারেন:

'ক্লাস'->নতুন()

অবশ্যই, যদি ক্লাসের নামটি স্কেলারে থাকে তবে পার্লও সঠিক কাজ করবে:

my $class = 'ক্লাস';
$class->new();

পরোক্ষ উদ্দেশ্য বাক্য গঠন

বাহিরে of দ্য ফাইল হাতল মামলা, ব্যবহার of এই বাক্য গঠন is নিরূত্সাহ as it পারেন বিভ্রান্ত দ্য
পার্ল দোভাষী দেখ নিচে উন্নত অধিক বিবরণ।

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

এই সিনট্যাক্সটি যেকোন ক্লাস বা অবজেক্ট পদ্ধতির সাথে ব্যবহার করা যেতে পারে:

আমার $ফাইল = নতুন ফাইল $পাথ, $ডেটা;
$file সংরক্ষণ করুন;

আমরা সুপারিশ করছি যে আপনি এই সিনট্যাক্স এড়িয়ে চলুন, বিভিন্ন কারণে।

প্রথমত, এটি পড়তে বিভ্রান্তিকর হতে পারে। উপরের উদাহরণে, "সংরক্ষণ" একটি কিনা তা পরিষ্কার নয়
"ফাইল" শ্রেণী দ্বারা প্রদত্ত পদ্ধতি বা কেবল একটি সাবরুটিন যা একটি ফাইল অবজেক্ট হিসাবে আশা করে
তার প্রথম যুক্তি।

ক্লাস পদ্ধতি ব্যবহার করা হলে, সমস্যা আরও খারাপ হয়। কারণ পার্ল সাবরুটিনের অনুমতি দেয়
নামগুলো বেয়ারওয়ার্ড হিসেবে লিখতে হবে, পার্লকে অনুমান করতে হবে যে পদ্ধতির পরে বেয়ারওয়ার্ড আছে কিনা
একটি শ্রেণীর নাম বা সাবরুটিন নাম। অন্য কথায়, পার্ল উভয় হিসাবে সিনট্যাক্স সমাধান করতে পারে
"ফাইল->নতুন ($পথ, $ডেটা)" or "নতুন( ফাইল ( $পথ, $ডেটা ) )"।

এই কোড পার্স করার জন্য, পার্ল কোন প্যাকেজের নাম দেখেছে, কিসের উপর ভিত্তি করে হিউরিস্টিক ব্যবহার করে
বর্তমান প্যাকেজে সাবরুটিন বিদ্যমান, এটি পূর্বে কোন বেয়ারওয়ার্ড দেখেছে এবং অন্যান্য
ইনপুট. বলা বাহুল্য, হিউরিস্টিকস খুব আশ্চর্যজনক ফলাফল দিতে পারে!

পুরানো ডকুমেন্টেশন (এবং কিছু CPAN মডিউল) এই সিনট্যাক্সকে উৎসাহিত করেছে, বিশেষ করে এর জন্য
কনস্ট্রাক্টর, তাই আপনি এখনও এটি বন্য মধ্যে খুঁজে পেতে পারেন. যাইহোক, আমরা আপনাকে এড়াতে উত্সাহিত করি
নতুন কোডে এটি ব্যবহার করে।

আপনি পার্লকে এর সাথে "::" যুক্ত করে একটি শ্রেণীর নাম হিসাবে বেয়ারওয়ার্ড ব্যাখ্যা করতে বাধ্য করতে পারেন, যেমন
আমরা আগে দেখেছি:

আমার $file = নতুন ফাইল:: $path, $data;

"আশীর্বাদ", "ধন্য", এবং "রেফ"
যেমনটি আমরা আগে দেখেছি, একটি বস্তু কেবলমাত্র একটি ডেটা স্ট্রাকচার যা একটি শ্রেণীতে আশীর্বাদ করা হয়েছে
"আশীর্বাদ" ফাংশনের মাধ্যমে। "আশীর্বাদ" ফাংশনটি এক বা দুটি আর্গুমেন্ট নিতে পারে:

আমার $object = bless {}, $class;
আমার $object = আশীর্বাদ {};

প্রথম ফর্মে, বেনামী হ্যাশ $ক্লাসে ক্লাসে আশীর্বাদ করা হচ্ছে। মধ্যে
দ্বিতীয় ফর্ম, বেনামী হ্যাশ বর্তমান প্যাকেজ আশীর্বাদ করা হয়.

দ্বিতীয় ফর্মটি দৃঢ়ভাবে নিরুৎসাহিত করা হয়, কারণ এটি একটি সাবক্লাসের ক্ষমতাকে ভেঙে দেয়
পিতামাতার কনস্ট্রাক্টর পুনরায় ব্যবহার করুন, তবে আপনি এখনও বিদ্যমান কোডে এটি জুড়ে চালাতে পারেন।

আপনি যদি জানতে চান যে কোনও নির্দিষ্ট স্কেলার কোনও বস্তুকে বোঝায়, আপনি ব্যবহার করতে পারেন
Scalar::Util দ্বারা রপ্তানি করা "আশীর্বাদকৃত" ফাংশন, যা পার্ল কোরের সাথে পাঠানো হয়।

Scalar::'blessed' ব্যবহার করুন;

যদি ( সংজ্ঞায়িত ধন্য ($ জিনিস) ) { ... }

যদি $thing কোনো বস্তুকে বোঝায়, তাহলে এই ফাংশনটি প্যাকেজের নাম প্রদান করে
বস্তুর মধ্যে আশীর্বাদ করা হয়েছে. যদি $thing-এ কোনো আশীর্বাদপূর্ণ বস্তুর উল্লেখ না থাকে,
"আশীর্বাদকৃত" ফাংশনটি "undef" প্রদান করে।

মনে রাখবেন যে $thing একটি ক্লাসে আশীর্বাদ করা হলে "blessed($thing)" মিথ্যাও ফিরে আসবে
নাম "0"। এটি একটি সম্ভাব্য, কিন্তু বেশ প্যাথলজিকাল। "0" নামে একটি ক্লাস তৈরি করবেন না
যদি না আপনি জানেন যে আপনি কি করছেন।

একইভাবে, পার্লের অন্তর্নির্মিত "রেফ" ফাংশনটি একটি আশীর্বাদপূর্ণ বস্তুর উল্লেখ করে
বিশেষভাবে আপনি যদি "ref($thing)" কল করেন এবং $thing একটি বস্তুর রেফারেন্স ধারণ করে, তাহলে এটি হবে
বস্তুর আশীর্বাদ করা হয়েছে যে শ্রেণীর নাম ফেরত.

আপনি যদি কেবল পরীক্ষা করতে চান যে একটি ভেরিয়েবলে একটি বস্তুর রেফারেন্স রয়েছে, আমরা সুপারিশ করি
যে আপনি "সংজ্ঞায়িত আশীর্বাদ ($অবজেক্ট)" ব্যবহার করেন, যেহেতু "রেফ" সবার জন্য সত্য মান প্রদান করে
রেফারেন্স, শুধু বস্তু নয়।

সার্জারির সর্বজনীন শ্রেণী
সমস্ত ক্লাস স্বয়ংক্রিয়ভাবে ইউনিভার্সাল ক্লাস থেকে উত্তরাধিকারী হয়, যা পার্লে অন্তর্নির্মিত
মূল. এই ক্লাসটি বেশ কয়েকটি পদ্ধতি প্রদান করে, যার সবকটিই হয় একটিতে কল করা যেতে পারে
ক্লাস বা একটি বস্তু। আপনি আপনার ক্লাসে এই পদ্ধতিগুলির কিছু ওভাররাইড করতেও বেছে নিতে পারেন।
আপনি যদি তা করেন তবে আমরা আপনাকে নীচে বর্ণিত অন্তর্নির্মিত শব্দার্থবিদ্যা অনুসরণ করার পরামর্শ দিই।

isa($শ্রেণী)
"isa" পদ্ধতি ফিরে আসে সত্য যদি অবজেক্টটি $class-এ ক্লাসের সদস্য হয়, অথবা a
$class-এর একটি সাবক্লাসের সদস্য।

আপনি যদি এই পদ্ধতিটি ওভাররাইড করেন তবে এটি কখনই একটি ব্যতিক্রম নিক্ষেপ করা উচিত নয়।

DOES($ ভূমিকা)
"DOES" পদ্ধতিটি ফিরে আসে সত্য যদি এর বস্তুটি $role ভূমিকা পালন করার দাবি করে। দ্বারা
ডিফল্ট, এটি "isa" এর সমতুল্য। এই পদ্ধতি অবজেক্ট সিস্টেম দ্বারা ব্যবহারের জন্য উপলব্ধ করা হয়
এক্সটেনশন যা ভূমিকা বাস্তবায়ন করে, যেমন "Moose" এবং "Role::Tiny"।

আপনি সরাসরি আপনার নিজের ক্লাসে "DOES" ওভাররাইড করতে পারেন। যদি আপনি এই ওভাররাইড
পদ্ধতি, এটি একটি ব্যতিক্রম নিক্ষেপ করা উচিত নয়.

পারেন($পদ্ধতি)
"ক্যান" পদ্ধতিটি পরীক্ষা করে যে ক্লাস বা অবজেক্টটিতে এটি কল করা হয়েছিল তার একটি পদ্ধতি আছে কিনা
নাম $method। এটি ক্লাসের পদ্ধতি এবং এর সমস্ত অভিভাবকদের জন্য পরীক্ষা করে। যদি
পদ্ধতি বিদ্যমান, তারপর সাবরুটিনের একটি রেফারেন্স ফেরত দেওয়া হয়। যদি না হয় তাহলে
"undef" ফেরত দেওয়া হয়।

যদি আপনার ক্লাস "AUTOLOAD" এর মাধ্যমে মেথড কলগুলিতে সাড়া দেয়, তাহলে আপনি "ক্যান" ওভারলোড করতে চাইতে পারেন
আপনার "AUTOLOAD" পদ্ধতি পরিচালনা করে এমন পদ্ধতিগুলির জন্য একটি সাবরুটিন রেফারেন্স ফেরত দিতে।

আপনি যদি এই পদ্ধতিটি ওভাররাইড করেন তবে এটি কখনই একটি ব্যতিক্রম নিক্ষেপ করা উচিত নয়।

সংস্করণ($ প্রয়োজন)
"VERSION" পদ্ধতিটি ক্লাসের (প্যাকেজ) সংস্করণ নম্বর প্রদান করে।

যদি $need আর্গুমেন্ট দেওয়া হয় তবে এটি বর্তমান সংস্করণটি পরীক্ষা করবে (সংজ্ঞায়িত হিসাবে
প্যাকেজে $VERSION ভেরিয়েবল দ্বারা) $need এর চেয়ে বেশি বা সমান; এটা হবে
এই ক্ষেত্রে না হলে মারা যান। এই পদ্ধতিটি "সংস্করণ" ফর্ম দ্বারা স্বয়ংক্রিয়ভাবে বলা হয়
ব্যবহার".

প্যাকেজ 1.2 qw (কিছু আমদানি করা সাব) ব্যবহার করুন;
# বোঝায়:
প্যাকেজ->সংস্করণ(1.2);

আমরা সুপারিশ করি যে আপনি অন্য প্যাকেজের সংস্করণ অ্যাক্সেস করতে এই পদ্ধতিটি ব্যবহার করুন, পরিবর্তে
সরাসরি $Package::VERSION-এর দিকে তাকিয়ে। আপনি যে প্যাকেজটি দেখছেন তা থাকতে পারে
"VERSION" পদ্ধতিটি ওভাররাইড করেছে৷

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

অটোলোড
আপনি যদি একটি পদ্ধতি কল করেন যা একটি ক্লাসে বিদ্যমান নেই, পার্ল একটি ত্রুটি নিক্ষেপ করবে। যাইহোক, যদি
সেই শ্রেণী বা এর যে কোনো অভিভাবক শ্রেণী একটি "অটোলোড" পদ্ধতিকে সংজ্ঞায়িত করে, যেটি "অটোলোড"
এর পরিবর্তে পদ্ধতি বলা হয়।

"অটোলোড" একটি নিয়মিত পদ্ধতি হিসাবে বলা হয়, এবং কলকারী পার্থক্যটি জানবে না।
আপনার "AUTOLOAD" পদ্ধতি যে মানই ফেরত দেয় তা কলারকে ফেরত দেওয়া হয়।

সম্পূর্ণ যোগ্য পদ্ধতির নাম যা বলা হয়েছিল $AUTOLOAD প্যাকেজে উপলব্ধ
আপনার ক্লাসের জন্য বিশ্বব্যাপী। যেহেতু এটি একটি বিশ্বব্যাপী, আপনি যদি এটিকে উল্লেখ করতে চান তবে এটি একটি ছাড়াই করুন
প্যাকেজ নামের উপসর্গ "কঠোর 'ভারস'" এর অধীনে, আপনাকে এটি ঘোষণা করতে হবে।

# XXX - এটি অ্যাক্সেসরগুলি বাস্তবায়নের একটি ভয়ানক উপায়, তবে এটি তৈরি করে
# একটি সাধারণ উদাহরণের জন্য।
আমাদের $AUTOLOAD;
সাব অটোলোড {
আমার $self = শিফট;

# মূল পদ্ধতির নাম থেকে কোয়ালিফায়ার সরান...
আমার $called = $AUTOLOAD =~ s/.*:://r;

# এই নামের কোন গুণ আছে?
die "এমন কোনো বৈশিষ্ট্য নেই: $called"
যদি না থাকে $self->{$called};

# যদি তাই হয় তবে ফিরিয়ে দিন...
ফেরত $self->{$called};
}

সাব ডিস্ট্রোয় { } # নীচে দেখুন

"আমাদের $AUTOLOAD" ঘোষণা ছাড়া, এই কোড কঠোর অধীনে কম্পাইল করা হবে না
pragma

মন্তব্যটি বলে, এটি অ্যাক্সেসরগুলি বাস্তবায়নের একটি ভাল উপায় নয়। এটা ধীর এবং খুব
দূর থেকে চালাক যাইহোক, আপনি এটিকে পুরানো পার্ল কোডে অ্যাক্সেসর সরবরাহ করার উপায় হিসাবে দেখতে পারেন।
পার্লে OO কোডিংয়ের সুপারিশের জন্য perlootut দেখুন।

যদি আপনার ক্লাসে একটি "অটোলোড" পদ্ধতি থাকে, আমরা দৃঢ়ভাবে সুপারিশ করি যে আপনি ওভাররাইড করুন৷
আপনার ক্লাসেও "পারি"। আপনার ওভাররাইড করা "ক্যান" পদ্ধতিটি একটি সাবরুটিন ফিরিয়ে দেওয়া উচিত
যে কোনো পদ্ধতির জন্য রেফারেন্স যা আপনার "AUTOLOAD" সাড়া দেয়।

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

বস্তুটি ধ্বংস হয়ে গেলে আপনি যদি কিছু করতে চান তবে আপনি একটি "DESTROY" সংজ্ঞায়িত করতে পারেন
আপনার ক্লাসে পদ্ধতি। এই পদ্ধতিটি সর্বদা উপযুক্ত সময়ে পার্ল দ্বারা কল করা হবে,
পদ্ধতি খালি না হলে।

এটিকে অন্য যেকোন পদ্ধতির মতো বলা হয়, প্রথম আর্গুমেন্ট হিসাবে অবজেক্ট সহ। এটা করে
কোনো অতিরিক্ত আর্গুমেন্ট পাবেন না। যাইহোক, $_[0] ভেরিয়েবলটি শুধুমাত্র পঠনযোগ্য হবে
ধ্বংসকারী, তাই আপনি এটিতে একটি মান নির্ধারণ করতে পারবেন না।

যদি আপনার "DESTROY" পদ্ধতি একটি ত্রুটি ছুঁড়ে, এই ত্রুটি উপেক্ষা করা হবে. এটা পাঠানো হবে না
"STDERR" এ এবং এটি প্রোগ্রামটি মারা যাবে না। তবে, যদি আপনার ধ্বংসকারী হয়
একটি "eval {}" ব্লকের ভিতরে চলছে, তাহলে ত্রুটি $@ এর মান পরিবর্তন করবে।

যেহেতু "DESTROY" পদ্ধতিগুলি যে কোনও সময় কল করা যেতে পারে, আপনার যে কোনও বিশ্বব্যাপী স্থানীয়করণ করা উচিত৷
ভেরিয়েবল আপনি আপনার "DESTROY" এ আপডেট করতে পারেন। বিশেষ করে, আপনি যদি "eval {}" ব্যবহার করেন তাহলে আপনি
$@ স্থানীয়করণ করা উচিত, এবং আপনি যদি "সিস্টেম" বা ব্যাকটিক্স ব্যবহার করেন তবে আপনার স্থানীয়করণ করা উচিত $?।

আপনি যদি আপনার ক্লাসে একটি "অটোলোড" সংজ্ঞায়িত করেন, তাহলে পার্ল আপনার "অটোলোড" হ্যান্ডেল করতে কল করবে
"ধ্বংস" পদ্ধতি। আপনি একটি খালি "DESTROY" সংজ্ঞায়িত করে এটি প্রতিরোধ করতে পারেন, যেমন আমরা করেছি৷
অটোলোডিং উদাহরণ। আপনি $AUTOLOAD এর মানও পরীক্ষা করতে পারেন এবং ছাড়াই ফিরে আসতে পারেন
"DESTROY" হ্যান্ডেল করার জন্য ডাকা হলে কিছু করা।

বিশ্বব্যাপী ধ্বংস

প্রোগ্রামের আগে বিশ্বব্যাপী ধ্বংসের সময় যে ক্রমে বস্তুগুলিকে ধ্বংস করা হয়
প্রস্থান অপ্রত্যাশিত। এর মানে হল যে কোনো বস্তু আপনার অবজেক্টের মধ্যে থাকতে পারে
ধ্বংস করা হয়েছে। একটি কল করার আগে আপনার চেক করা উচিত যে একটি অন্তর্ভুক্ত বস্তু সংজ্ঞায়িত করা হয়েছে
এর উপর পদ্ধতি:

উপ ধ্বংস {
আমার $self = শিফট;

$self->{handle}->close() যদি $self->{handle};
}

আপনি বর্তমানে বিশ্বে আছেন কিনা তা সনাক্ত করতে আপনি "${^GLOBAL_PHASE}" ভেরিয়েবল ব্যবহার করতে পারেন
ধ্বংস পর্যায়:

উপ ধ্বংস {
আমার $self = শিফট;

${^GLOBAL_PHASE} eq 'DESTRUCT' হলে ফেরত দিন;

$self->{handle}->close();
}

উল্লেখ্য যে এই ভেরিয়েবলটি পার্ল 5.14.0 এ যোগ করা হয়েছে। আপনি যদি বিশ্বব্যাপী সনাক্ত করতে চান
পার্লের পুরানো সংস্করণে ধ্বংসের পর্যায়, আপনি "ডেভেল::গ্লোবাল ডিস্ট্রাকশন" ব্যবহার করতে পারেন
CPAN-এর মডিউল।

যদি আপনার "DESTROY" পদ্ধতি বিশ্বব্যাপী ধ্বংসের সময় একটি সতর্কতা জারি করে, পার্ল দোভাষী
সতর্কতার সাথে "বৈশ্বিক ধ্বংসের সময়" স্ট্রিংটি যুক্ত করবে।

বিশ্বব্যাপী ধ্বংসের সময়, পার্ল সর্বদা আবর্জনা সংগ্রহের আগে বস্তু সংগ্রহ করবে
তথ্যসূত্র গ্লোবাল সম্পর্কে আরও তথ্যের জন্য পার্লহ্যাকটিপসে "PERL_DESTRUCT_LEVEL" দেখুন
ধ্বংস

অ-হ্যাশ অবজেক্টস
এখন পর্যন্ত সমস্ত উদাহরণ একটি আশীর্বাদ হ্যাশ উপর ভিত্তি করে বস্তু দেখানো হয়েছে. যাইহোক, এটা
স্কেলার, গ্লোব এবং সহ যেকোন ধরণের ডেটা স্ট্রাকচার বা রেফারেন্টকে আশীর্বাদ করা সম্ভব
সাবরুটিন বন্য মধ্যে কোড খুঁজছেন যখন আপনি জিনিস এই সাজানোর দেখতে পারেন.

এখানে একটি আশীর্বাদ স্কেলার হিসাবে একটি মডিউলের একটি উদাহরণ:

প্যাকেজ সময়;

কঠোর ব্যবহার করুন;
সতর্কতা ব্যবহার করুন;

সাব নতুন {
আমার $ক্লাস = শিফট;

আমার $time = সময়;
ফিরে আশীর্বাদ \$সময়, $শ্রেণী;
}

উপযুগ {
আমার $self = শিফট;
ফেরত ${ $self };
}

আমার $time = সময়->নতুন();
প্রিন্ট $time->epoch();

ইনসাইড-আউট বস্তু
অতীতে, পার্ল সম্প্রদায় "অভ্যন্তরীণ-আউট অবজেক্ট" নামে একটি কৌশল নিয়ে পরীক্ষা করেছিল।
একটি অভ্যন্তরীণ-আউট অবজেক্ট বস্তুর রেফারেন্সের বাইরে তার ডেটা সঞ্চয় করে, a-তে সূচীকৃত
বস্তুর অনন্য বৈশিষ্ট্য, যেমন তার মেমরি ঠিকানা, বস্তুর পরিবর্তে
নিজেই এটি অবজেক্ট অ্যাট্রিবিউটের এনক্যাপসুলেশন কার্যকর করার সুবিধা রয়েছে, যেহেতু
তাদের তথ্য বস্তু নিজেই সংরক্ষণ করা হয় না.

এই কৌশলটি কিছু সময়ের জন্য জনপ্রিয় ছিল (এবং ড্যামিয়ান কনওয়েতে সুপারিশ করা হয়েছিল পার্ল সেরা
অভ্যাস), কিন্তু সর্বজনীন গ্রহণযোগ্যতা অর্জন করতে পারেনি। CPAN-এ অবজেক্ট::InsideOut মডিউল
এই কৌশলটির একটি ব্যাপক বাস্তবায়ন প্রদান করে এবং আপনি এটি বা অন্য কিছু দেখতে পারেন
বন্য মধ্যে ভিতরে বাইরে মডিউল.

এখানে Hash::Util::FieldHash কোর মডিউল ব্যবহার করে কৌশলটির একটি সহজ উদাহরণ দেওয়া হল।
ভিতরের-আউট অবজেক্ট বাস্তবায়ন সমর্থন করার জন্য এই মডিউলটি মূলে যুক্ত করা হয়েছিল।

প্যাকেজ সময়;

কঠোর ব্যবহার করুন;
সতর্কতা ব্যবহার করুন;

হ্যাশ::ইউটিল::ফিল্ডহ্যাশ 'ফিল্ডহ্যাশ' ব্যবহার করুন;

ফিল্ডহ্যাশ আমার %time_for;

সাব নতুন {
আমার $ক্লাস = শিফট;

আমার $self = আশীর্বাদ \( আমার $অবজেক্ট), $শ্রেণী;

$time_for{$self} = সময়;

ফেরত $self;
}

উপযুগ {
আমার $self = শিফট;

ফেরত $time_for{$self};
}

আমার $time = সময়->নতুন;
প্রিন্ট $time->epoch;

ছদ্ম-হ্যাশ
সিউডো-হ্যাশ বৈশিষ্ট্যটি ছিল একটি পরীক্ষামূলক বৈশিষ্ট্য যা পার্লের পূর্ববর্তী সংস্করণগুলিতে প্রবর্তিত হয়েছিল
এবং 5.10.0 এ সরানো হয়েছে। একটি ছদ্ম-হ্যাশ একটি অ্যারে রেফারেন্স যা ব্যবহার করে অ্যাক্সেস করা যেতে পারে
একটি হ্যাশ মত নামযুক্ত কী. আপনি এটি ব্যবহার করে বন্য কিছু কোড চালাতে পারেন. দেখুন
আরো তথ্যের জন্য ক্ষেত্র pragma.

onworks.net পরিষেবা ব্যবহার করে অনলাইনে perlobj ব্যবহার করুন


বিনামূল্যে সার্ভার এবং ওয়ার্কস্টেশন

উইন্ডোজ এবং লিনাক্স অ্যাপ ডাউনলোড করুন

লিনাক্স কমান্ডগুলি

Ad




×
ভি .আই. পি  বিজ্ঞাপন
❤️এখানে কেনাকাটা করুন, বুক করুন, অথবা কিনুন — বিনামূল্যে, পরিষেবাগুলি বিনামূল্যে রাখতে সাহায্য করে।