পার্লের @ আইএনসি কীভাবে নির্মিত হয়? (ওরফে পার্ল মডিউলগুলি যেখানে অনুসন্ধান করা হয় সেখানে প্রভাবিত করার সমস্ত উপায় কী?)


199

পার্ল মডিউলগুলি যেখানে সন্ধান করা হয় সেখানে প্রভাবিত করার সমস্ত উপায় কী? বা, পার্লের @ আইএনসি কীভাবে নির্মিত হয় ?

যেমনটি আমরা জানি, পার্ল @INCযেখানে পার্ল মডিউল ফাইলগুলি অনুসন্ধান করতে হবে তা নির্ধারণ করতে ডিরেক্টরি নাম যুক্ত অ্যারে ব্যবহার করে

স্ট্যাকওভারফ্লোতে একটি বিস্তৃত "@INC" এফএকিউ-টাইপ পোস্ট বলে মনে হচ্ছে না, তাই এই প্রশ্নটি একটি হিসাবে তৈরি।


7
হ্যাঁ, কিন্তু সেখানে একটি পুরোপুরি ভালো এক search.cpan.org/perldoc/... ?
ভিড়

3
@ মোব্রোল: আমি মনে করি না যে এটি কোথাও বিস্তৃত হিসাবে খুব কাছাকাছি - এটি কেবল @INCরানটাইমে কীভাবে যুক্ত করতে হবে তা বলছে , সম্পূর্ণ নির্মাণ নয়।
ক্যাসাবেল

2
@ মোব্রুল - @ জেফ্রোমি ঠিকই অনুমান করেছিলেন - যে কোনও এবং এখন পর্যন্ত যে সমস্ত রেফারেন্স পেয়েছি তার মধ্যে প্রধান সমস্যাটি ছিল পার্ল বাইনারি-র সংকলিত ইন-ডিফল্ট @INC
ডিভিকে

3
কিছু আমাকে একটি প্যাচ প্রেরণ করে উত্তরটিকে ব্যাপক হিসাবে তৈরি করতে পারে। পারফ্যালাক গিথুবে থাকার কারণে এটি সহজ। :)
ব্রায়ান ডি ফাই

1
ঠিক আছে, "পার্ল বাইনারি'র সংকলিত ইন ডিফল্ট @ আইএনসি সম্পর্কিত সামগ্রিক তথ্য" হ'ল এটিই সেই ব্যক্তি যিনি এটি সেট আপ করেছিলেন। আপনি যদি সেখানে প্রবেশের বিভিন্ন পথ সম্পর্কে জিজ্ঞাসা করেন তবে আমি মনে করি আপনি যে উত্তর দিয়েছেন তার চেয়ে আপনার আলাদা প্রশ্ন আছে।
ব্রায়ান ডি ফাই ২

উত্তর:


254

এই অ্যারের সামগ্রীগুলি কীভাবে তৈরি করা হয়েছে এবং পার্ল ইন্টারপ্রেটার কোথায় মডিউল ফাইলগুলি খুঁজে পাবে তা প্রভাবিত করার জন্য আমরা হেরফের করব।

  1. ডিফল্ট @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

  1. পরিবেশগত পরিবর্তনশীল PERL5LIB(বা PERLLIB)

    আপনার শেলের পরিবেশগত পরিবর্তনশীল (যদি এটি সংজ্ঞায়িত না করা হয় তবে ব্যবহৃত হয়) এর @INCমধ্যে থাকা ডিরেক্টরিগুলির তালিকা (কোলন-বিচ্ছিন্ন) সহ পার্ল প্রাক-পেনডগুলি । বিষয়বস্তু দেখার জন্য পরে এবং বিভিন্ন পরিবেশের রান প্রভাব করেছি ।PERL5LIBPERLLIB@INCPERL5LIBPERLLIBperl -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
     .
  2. -I কমান্ড-লাইন বিকল্প

    কমান্ড-লাইন বিকল্পের @INCমান হিসাবে পাসরি ডিরেক্টরিগুলির (কোলন-বিচ্ছিন্ন) একটি তালিকা সহ পূর্ব-পেন্ডস পার্ল -I। পার্ল অপশন সহ যথারীতি এটি তিনটি উপায়ে করা যেতে পারে:

    • কমান্ড লাইনে এটি পাস করুন:

      perl -I /my/moduledir your_script.pl
    • আপনার পার্ল স্ক্রিপ্টের প্রথম লাইনে (শেবাং) এটি পাস করুন:

      #!/usr/local/bin/perl -w -I /my/moduledir
    • এর অংশ হিসেবে এটা পাস PERL5OPT(অথবা PERLOPT) এনভায়রনমেন্ট ভেরিয়েবল (ইন অধ্যায় 19,02 দেখতে পার্ল প্রোগ্রামিং )

  3. প্রাগমার মাধ্যমে এটি পাস করুনlib

    পার্ল প্রাক-দুল @INC ডিরেক্টরিগুলির একটি তালিকা দিয়ে এটি মাধ্যমে প্রবেশ করে use lib

    একটি প্রোগ্রামে:

    use lib ("/dir1", "/dir2");

    কমান্ড লাইনে:

    perl -Mlib=/dir1,/dir2

    আপনি এটিও করতে পারেন থেকে ডিরেক্টরি মুছে ফেলুন @INCমাধ্যমেno lib

  4. আপনি সরাসরি কারচুপি করতে পারেন @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- এ সাব্রোটিন রেফারেন্স কখন বলা হয় তাতে ব্যাখ্যা করা হয়েছে )।


1
পার্লপটি ভুলে যাবেন না, যেখানে আপনি সেট করতে পারেন I এছাড়াও, বেস.এমপি এবং স্থানীয় :: লিবের মতো জিনিসগুলি আপনার অন্তর্ভুক্ত তালিকাভুক্ত জিনিসগুলি ব্যবহার করে।
ব্রায়ান ডি ফোয়াই

1
@ ব্রায়ান - ব্যবহার :: বেস এটি আইআরসি এর নীচে "প্রয়োজনীয়" কারণে ব্যবহার করে। আমি স্থানীয় ::
লিবের

3
এছাড়াও, এটিকে সত্যিই ভাল উত্তর দেওয়ার জন্য, লোকদের যখন তাদের প্রতিটি ব্যবহার করা উচিত তখন আপনাকে তাদের বলা উচিত। কীভাবে তারা খুব সহায়ক হতে পারে না তার জন্য কেবল তাদের 10 টি বিকল্প দেওয়া। :)
ব্রায়ান ডি ফয়ে

পিএস যে কেউ, দয়া করে দ্বি-আর্কিটেকচার-নির্দিষ্ট ডিরেক্টরি অন্তর্ভুক্ত করতে উত্তরটি সম্পাদনা করতে দ্বিধা বোধ করুন -I / ব্যবহার lib এর মাধ্যমে। আমি পরবর্তীতে নিজেই এটি করার পরিকল্পনা করেছি তবে আপাতত অফলাইন হওয়া দরকার।
ডিভি কে

@ ব্রায়ান - PERLOPT যুক্ত হয়েছে। আমি বেস.এমপি এবং অন্যান্য "কখন আইআইএনসি ব্যবহার করি" আইটেমগুলি @ আইএনসি / আমি যে পোস্ট করা এবং এখান থেকে লিঙ্কযুক্ত মডিউল ফাইলগুলি সন্ধান করি তার চেয়ে বেশি উপযুক্ত বলে মনে করি, তাই আমি এটি সেখানে রেখেছি।
ডিভি কে ২

18

উপরে তালিকাভুক্ত অবস্থানগুলি ছাড়াও পার্লের ওএস এক্স সংস্করণে আরও দুটি উপায় রয়েছে:

  1. / লাইব্রেরি / পার্ল / এক্স.এক্সএক্স / অ্যাপেন্ডটোপথ ফাইল। এই ফাইলটিতে তালিকাভুক্ত পাথগুলি রানটাইমে @ আইএনসিতে সংযুক্ত করা হয়।

  2. / লাইব্রেরি / পার্ল / এক্স.এক্সএক্স / প্রিপেন্ডটোপথ ফাইল। এই ফাইলে তালিকাভুক্ত পাথগুলি রানটাইমে @ আইএনসি-তে যুক্ত করা হয়।


6

যেমনটি ইতিমধ্যে বলা হয়েছিল @ আইএনসি একটি অ্যারে এবং আপনি যা খুশি তাই যুক্ত করতে পারেন।

আমার সিজিআই আরআরএস স্ক্রিপ্টটি দেখে মনে হচ্ছে:

#!/usr/bin/perl
use strict;
use warnings;
BEGIN {
    push @INC, 'fully_qualified_path_to_module_wiht_our_REST.pm';
}
use Modules::Rest;
gone(@_);

সাববুটিন চলে গেছে র‌্যাস্ট.এম. দ্বারা রফতানি করা।

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