2013-02-13 10 views
5

अगर मैं एक .pm फ़ाइल है, वहाँ मेरे @INC पथ पर रखकर बिना एक तरह से मैं इसे use सकता है? मुझे लगता है कि मेरी विशेष उपयोग के मामले में स्पष्ट हो सकता है - संबंधित पथ का उपयोग कर या @INC को इस निर्देशिका जोड़ने से साफ।पर्ल का उपयोग/निरपेक्ष पथ की आवश्यकता है?

संपादित करें: स्पष्टीकरण:।

मैं आवश्यकता @INC में हर आइटम के माध्यम से पुनरावृति करने के लिए से बचने के लिए, और बदले सीधे निर्दिष्ट जो फ़ाइल मैं में दिलचस्पी है उम्मीद थी उदाहरण के लिए, Node.js में, require('something') होगा पथों की सूची खोजें, लेकिन require('/specific/something') सीधे जहां मैं इसे कहूंगा वहां जाऊंगा।

पर्ल में, मुझे विश्वास है कि यह एक ही require में पाया कार्यक्षमता है नहीं हूँ, लेकिन यह काम करने लगता है।

हालांकि, use बयानों को शब्दकोष की आवश्यकता है। इसने मुझे एक पूर्ण पथ में प्रवेश करने के तरीके पर थोड़ा फंस दिया है। (अस्थायी रूप से, कोई डर नहीं, कि क्या use lib भी करता है)

use lib '/path/to/Perl_module_dir'; # can be both relative or absolute 
use my_own_lib; 

आप @INC खुद के द्वारा संशोधित कर सकते हैं:

+0

'उपयोग मॉड्यूल' से पहले lib 'कथन का उपयोग करें' आपके मामले के लिए सही होगा। लेकिन आप 'आवश्यकता' का उपयोग क्यों नहीं कर सकते। यह आपकी समस्या के लिए अधिक उपयुक्त है। इसके अलावा आप पूरे प्रोजेक्ट या एप्लिकेशन के लिए उस निर्देशिका को लागू करने के लिए अपाचे conf में 'SetEnv PERL5LIB' पर्यावरण चर डाल सकते हैं। –

+0

मुझे '.pm' फ़ाइल की आवश्यकता है। मैंने कोशिश नहीं की है, लेकिन ऐसा प्रतीत नहीं होता है कि यह सही काम करेगा। मैं आमतौर पर मॉड्यूल में 'CGI :: ReadParse();' या 'CGI' का उपयोग करता हूं: cgi '; मुझे नहीं पता कि मैं '.pm 'फ़ाइल के लिए' आवश्यकता 'के साथ ऐसा कैसे कर सकता हूं, लेकिन अगर मैं इसे' आवश्यकता 'के साथ कर सकता हूं, तो यह वास्तव में मेरी समस्या का समाधान करेगा। –

+0

यह काम करता है। इस तरह की कोशिश करें 'Newmodule.pm "की आवश्यकता है;' और फिर 'नया मॉड्यूल :: उपनाम();' कॉल करें। यह ठीक निष्पादित करता है। –

उत्तर

4

टिप्पणी में प्रति चर्चा के रूप में, मैं require ही उपयोग करने का सुझाव होगा। नीचे दिए गए जैसा

require "pathto/module/Newmodule.pm"; 

Newmodule::firstSub(); 

इसके अलावा, आप

  • use lib 'pathto/module'; नीचे के रूप में अन्य विकल्पों का उपयोग कर सकते हैं इस लाइन हर फाइल करने के लिए आप में मॉड्यूल का उपयोग करना चाहते जोड़े जाने की जरूरत है।

lib 'pathto/मॉड्यूल' का प्रयोग करें;
न्यूम्यूल का उपयोग करें;

  • PERL5LIB वातावरण चर का उपयोग कर

    ।इसे निर्यात का उपयोग करके कमांड लाइन पर सेट करें या इसे ~/.bashrc पर जोड़ें ताकि प्रत्येक लॉगिन के साथ इसे आपके @INC में जोड़ा जाएगा। याद रखें PERL5LIB सभी @INC निर्देशिकाओं से पहले निर्देशिका जोड़ता है। तो यह पहले इस्तेमाल किया जाएगा। इसके अलावा, आप

    SetEnv PERL5LIB /fullpath/to/module 
    
  • का उपयोग कर अपाचे httpd.conf में यह सेट या यह सेट में ब्लॉक शुरू कर सकते हैं।

4

आप इस का उपयोग कर सकते हैं

BEGIN{ @INC = ('/path/to/Perl_module_dir', @INC); } # relative or absolute too 
use my_own_lib; 
+0

उत्तरार्द्ध 'lib' का उपयोग करने के समान ही है, सिवाय इसके कि यह सुनिश्चित करने के लिए कि आपके स्वयं के मॉड्यूल एक ही नाम से पहले उठाए गए हैं, 'पॉप' के बजाय 'unshift' का उपयोग करता है। – Borodin

+0

POST सरणी की शुरुआत में धक्का देने के अनुसार संपादित किया गया। –

+2

एक ही निर्देशिका में एक मॉड्यूल डालने के रूप में आपके प्रोग्राम के रूप में केवल ठीक काम करता है अगर यह आपकी कामकाजी निर्देशिका है। '। ! = dirname 'डिफ़ॉल्ट रूप से ... – pavel

0

आप Module::Load मॉड्यूल का उपयोग कर सकते हैं

use Module::Load; 
load 'path/to/module.pm'; 
+0

का उपयोग करना चाहिए, कोई संकेत नहीं है कि वह रनटाइम पर मॉड्यूल लोड करना चाहता है, इसलिए आप मॉड्यूल को' BEGIN' में लपेटेंगे। यह प्रतीकों को आयात करने का साधन भी प्रदान नहीं करता है, इसलिए आपको BEGIN ब्लॉक में भी 'आयात' पर कॉल जोड़ना होगा। ओपी क्या करना चाहता है इसके लिए एक खराब समाधान। – ikegami

0

FindBin::libs करता है चाल:

# search up $FindBin::Bin looking for ./lib directories 
# and "use lib" them. 

use FindBin::libs; 
+0

यह FindBin का उपयोग करता है :: libs $ FindBin का उपयोग करता है: $ FindBin: RealBin के बजाय बिन, इसलिए यह स्क्रिप्ट के लिए सिम्लिंक का उपयोग करते समय काम नहीं करता है :( – ikegami

1

सामान्य शब्दों में, PERL5LIB पर्यावरण वर निर्धारित किया है।

export PERL5LIB=/home/ikegami/perl/lib 

मॉड्यूल को खोजने के लिए स्क्रिप्ट के लिए एक निर्देशिका सापेक्ष में स्थापित किया जा करने का इरादा है, तो का उपयोग करें:

use FindBin qw($RealBin); 
use lib $RealBin; 
    # or 
use lib "$RealBin/lib"; 
    # or 
use lib "$RealBin/../lib"; 

यह सही ढंग से स्क्रिप्ट के सांकेतिक लिंक को संभाल लेंगे।

$ mkdir t 

$ cat >t/a.pl 
use FindBin qw($RealBin); 
use lib $RealBin; 
use Module; 

$ cat >t/Module.pm 
package Module; 
print "Module loaded\n"; 
1; 

$ ln -s t/a.pl 

$ perl a.pl 
Module loaded 
संबंधित मुद्दे