এই অ্যারের সামগ্রীগুলি কীভাবে তৈরি করা হয়েছে এবং পার্ল ইন্টারপ্রেটার কোথায় মডিউল ফাইলগুলি খুঁজে পাবে তা প্রভাবিত করার জন্য আমরা হেরফের করব।
ডিফল্ট @INC
পার্ল ইন্টারপ্রেটার একটি নির্দিষ্ট @INC
ডিফল্ট মান দিয়ে সংকলিত হয় । এই মানটি জানতে, env -i perl -V
কমান্ড রান করুন ( পরিবেশগত পরিবর্তনশীল env -i
উপেক্ষা করুন PERL5LIB
- # 2 দেখুন) এবং আউটপুটে আপনি এই জাতীয় কিছু দেখতে পাবেন:
$ env -i perl -V
...
@INC:
/usr/lib/perl5/site_perl/5.18.0/x86_64-linux-thread-multi-ld
/usr/lib/perl5/site_perl/5.18.0
/usr/lib/perl5/5.18.0/x86_64-linux-thread-multi-ld
/usr/lib/perl5/5.18.0
.
.
শেষে নোট ; এটি বর্তমান ডিরেক্টরি (যা স্ক্রিপ্টের ডিরেক্টরি হিসাবে অগত্যা একই নয়)। এটি পার্ল 5.26+ এ অনুপস্থিত এবং যখন পার্ল -T
( দাগযুক্ত চেকগুলি সক্ষম করা হয়) দিয়ে চালিত হয় ।
পার্ল বাইনারি সংকলন কনফিগার করার সময় ডিফল্ট পাথ পরিবর্তন করতে কনফিগারেশন বিকল্পটি সেট করুন otherlibdirs
:
Configure -Dotherlibdirs=/usr/lib/perl5/site_perl/5.16.3
পরিবেশগত পরিবর্তনশীল PERL5LIB
(বা PERLLIB
)
আপনার শেলের পরিবেশগত পরিবর্তনশীল (যদি এটি সংজ্ঞায়িত না করা হয় তবে ব্যবহৃত হয়) এর @INC
মধ্যে থাকা ডিরেক্টরিগুলির তালিকা (কোলন-বিচ্ছিন্ন) সহ পার্ল প্রাক-পেনডগুলি । বিষয়বস্তু দেখার জন্য পরে এবং বিভিন্ন পরিবেশের রান প্রভাব করেছি ।PERL5LIB
PERLLIB
@INC
PERL5LIB
PERLLIB
perl -V
$ perl -V
...
%ENV:
PERL5LIB="/home/myuser/test"
@INC:
/home/myuser/test
/usr/lib/perl5/site_perl/5.18.0/x86_64-linux-thread-multi-ld
/usr/lib/perl5/site_perl/5.18.0
/usr/lib/perl5/5.18.0/x86_64-linux-thread-multi-ld
/usr/lib/perl5/5.18.0
.
-I
কমান্ড-লাইন বিকল্প
কমান্ড-লাইন বিকল্পের @INC
মান হিসাবে পাসরি ডিরেক্টরিগুলির (কোলন-বিচ্ছিন্ন) একটি তালিকা সহ পূর্ব-পেন্ডস পার্ল -I
। পার্ল অপশন সহ যথারীতি এটি তিনটি উপায়ে করা যেতে পারে:
কমান্ড লাইনে এটি পাস করুন:
perl -I /my/moduledir your_script.pl
আপনার পার্ল স্ক্রিপ্টের প্রথম লাইনে (শেবাং) এটি পাস করুন:
#!/usr/local/bin/perl -w -I /my/moduledir
এর অংশ হিসেবে এটা পাস PERL5OPT
(অথবা PERLOPT
) এনভায়রনমেন্ট ভেরিয়েবল (ইন অধ্যায় 19,02 দেখতে পার্ল প্রোগ্রামিং )
প্রাগমার মাধ্যমে এটি পাস করুনlib
পার্ল প্রাক-দুল @INC
ডিরেক্টরিগুলির একটি তালিকা দিয়ে এটি মাধ্যমে প্রবেশ করে use lib
।
একটি প্রোগ্রামে:
use lib ("/dir1", "/dir2");
কমান্ড লাইনে:
perl -Mlib=/dir1,/dir2
আপনি এটিও করতে পারেন থেকে ডিরেক্টরি মুছে ফেলুন @INC
মাধ্যমেno lib
।
আপনি সরাসরি কারচুপি করতে পারেন @INC
নিয়মিত পার্ল অ্যারে হিসাবে ।
দ্রষ্টব্য: যেহেতু @INC
সংকলন পর্যায়ে ব্যবহৃত হয়, এটি অবশ্যই একটি BEGIN {}
ব্লকের ভিতরে করা উচিত , যা use MyModule
বিবৃতিটির আগে pre
মাধ্যমে ডিরেক্টরিতে যুক্ত করুন unshift @INC, $dir
।
মাধ্যমে ডিরেক্টরি যুক্ত করুন push @INC, $dir
।
পার্ল অ্যারে দিয়ে আপনি যা কিছু করতে পারেন তা করুন।
দ্রষ্টব্য: ডিরেক্টরিগুলি এই উত্তরের তালিকাভুক্ত ক্রম অনুসারে আনশিফ্ট করা @INC
আছে, উদাহরণস্বরূপ @INC
, তালিকার মধ্যে ডিফল্টটি সর্বশেষে থাকে, তার আগে PERL5LIB
, পূর্বে -I
, use lib
প্রত্যক্ষ এবং @INC
ম্যানিপুলেশন, পরের দুটি যে কোনও ক্রমে পার্ল কোডে মিশ্রিত হয়।
তথ্যসূত্র:
@INC
স্ট্যাক ওভারফ্লোতে একটি বিস্তৃত FAQ- টাইপ পোস্ট বলে মনে হয় না , সুতরাং এই প্রশ্নটি হ'ল একটি হিসাবে চিহ্নিত।
প্রতিটি পন্থা কখন ব্যবহার করবেন?
যদি কোনও ডিরেক্টরিতে মডিউলগুলি আপনার সাইটে অনেকগুলি / সমস্ত স্ক্রিপ্ট ব্যবহার করার প্রয়োজন হয়, বিশেষত একাধিক ব্যবহারকারী দ্বারা চালিত হয়, সেই ডিরেক্টরিটি @INC
পার্ল বাইনারিতে সংকলিত ডিফল্টর মধ্যে অন্তর্ভুক্ত করা উচিত ।
ডিরেক্টরিতে মডিউলগুলি ব্যবহারকারী দ্বারা চালিত সমস্ত স্ক্রিপ্টগুলির জন্য নির্দিষ্ট ব্যবহারকারী দ্বারা একচেটিয়াভাবে ব্যবহার করা হবে (বা যদি পার্ল পুনরায় কম্পাইল @INC
করা পূর্ববর্তী ব্যবহারের ক্ষেত্রে ডিফল্ট পরিবর্তন করার বিকল্প নয় ) PERL5LIB
, সাধারণত ব্যবহারকারী লগইন করার সময় ব্যবহারকারীদের সেট করুন set
দ্রষ্টব্য: দয়া করে সাধারণ ইউনিক্স পরিবেশের পরিবর্তনশীল সমস্যাগুলি সম্পর্কে সচেতন হন - উদাহরণস্বরূপ নির্দিষ্ট ক্ষেত্রে স্ক্রিপ্টগুলি চালানো কোনও নির্দিষ্ট ব্যবহারকারীর পরিবেশের সাথে যেমন এটি চালানোর গ্যারান্টি দেয় না su
।
যদি ডিরেক্টরিতে মডিউলগুলি কেবল নির্দিষ্ট পরিস্থিতিতে ব্যবহার করা প্রয়োজন (যেমন স্ক্রিপ্ট (গুলি) বিকাশ / ডিবাগ মোডে কার্যকর করা হয়, আপনি হয় PERL5LIB
ম্যানুয়ালি সেট করতে পারেন বা -I
পার্লের বিকল্পটি পাস করতে পারেন।
যদি মডিউলগুলি কেবলমাত্র নির্দিষ্ট স্ক্রিপ্টগুলির জন্য ব্যবহার করার প্রয়োজন হয় তবে সমস্ত ব্যবহারকারী তাদের ব্যবহার করে থাকেন, প্রোগ্রামে use lib
/ no lib
প্রাগমাস নিজেই ব্যবহার করুন । ডিরেক্টরিটি অনুসন্ধানের জন্য রানটাইম চলাকালীন সময়ে গতিশীলভাবে নির্ধারণ করার প্রয়োজনে এটিও ব্যবহার করা উচিত - যেমন স্ক্রিপ্টের কমান্ড লাইন প্যারামিটার বা স্ক্রিপ্টের পথ থেকে ( খুব সুন্দর ব্যবহারের ক্ষেত্রে ফাইন্ডবিন মডিউল দেখুন )।
ডিরেক্টরিগুলি যদি @INC
কিছু জটিল যুক্তি অনুসারে ম্যানিপুলেট করা প্রয়োজন হয় , তবে use lib
/ no lib
প্রাগমাসের সমন্বয়ে প্রয়োগ করা খুব অযথাই অসম্ভব , তবে ব্লকের ভিতরে অথবা ম্যানিপুলেশনের জন্য নির্দিষ্ট একটি বিশেষ উদ্দেশ্যে গ্রন্থাগারের ভিতরে সরাসরি @INC
ম্যানিপুলেশন ব্যবহার করুন, যা আপনার স্ক্রিপ্ট দ্বারা অবশ্যই ব্যবহার করা উচিত (গুলি) অন্য কোনও মডিউল ব্যবহার করার আগে।BEGIN {}
@INC
এর উদাহরণ হ'ল প্রোড / ইউআট / দেব ডিরেক্টরিতে গ্রন্থাগারগুলির মধ্যে স্বয়ংক্রিয়ভাবে স্যুইচ করা, যদি জল এবং গ্রাফিক লাইব্রেরি পিকআপ থাকে তবে এটি ডিভ এবং / অথবা ইউএটি থেকে হারিয়ে যায় (শেষ শর্তটি স্ট্যান্ডার্ড "ইউজ লিব + ফাইন্ডবিন" সমাধানটিকে মোটামুটি জটিল করে তোলে A এই দৃশ্যকল্প বিস্তারিত চিত্রণ হয় আমি কিভাবে বিটা পার্ল স্ক্রিপ্ট থেকে বিটা পার্ল মডিউল ব্যবহার করেন? ।
সরাসরি ম্যানিপুলেটিংয়ের জন্য অতিরিক্ত ব্যবহারের ক্ষেত্রে @INC
সাববুটিন রেফারেন্স বা অবজেক্ট রেফারেন্স যুক্ত করতে সক্ষম হবেন (হ্যাঁ, ভার্জিনিয়া, @INC
কাস্টম পার্ল কোড থাকতে পারে এবং কেবল ডিরেক্টরি নাম থাকতে পারে না, যখন @INC- এ সাব্রোটিন রেফারেন্স কখন বলা হয় তাতে ব্যাখ্যা করা হয়েছে )।