2010-02-01 12 views
9

मेरे पास पर्ल मॉड्यूल के दो अलग-अलग संस्करण हैं। वर्तमान में, महत्वपूर्ण स्क्रिप्ट पर्यावरण चर द्वारा निर्दिष्ट मॉड्यूल के संस्करण का उपयोग करती है और सिस्टम विभिन्न उपयोगकर्ताओं द्वारा चलाए जा रहे विभिन्न कार्यों पर निर्भर करता है। उपयोगकर्ता का पर्यावरण निर्धारित करेगा कि पर्ल मॉड्यूल का कौन सा संस्करण उपयोग किया गया था।मैं पर्ल मॉड्यूल पथ को गतिशील रूप से कैसे बदलूं?

अब मैं इसे पर्ल स्क्रिप्ट के अंदर निर्दिष्ट संस्करण में बदलना चाहता हूं, यानी पारित विकल्पों के आधार पर। दुर्भाग्य से, इस तरह कोड:

if ($new){ use lib "newdir"; } 
else{ use lib "olddir"; } 
use module; 

काम नहीं करता है। पर्ल बस newdir और फिर olddir से @INC और फिर स्क्रिप्ट चलाता है।

मैं गतिशील रूप से किस मॉड्यूल का उपयोग करने के लिए निर्दिष्ट करूं?

BEGIN { 
    if ($new) { unshift @INC, "newdir"; } 
    else {  unshift @INC, "olddir"; } 
} 
use module; 

तुम भी PERL5LIB वातावरण चर सेट कर सकते हैं ताकि आप की जरूरत नहीं होगी: else कोड संकलन समय पर चलाया जाएगा -

उत्तर

15

आप एक BEGIN{} ब्लॉक का उपयोग करें ताकि आपके if की जरूरत स्क्रिप्ट में इस प्रकार की कॉन्फ़िगरेशन करें।

+0

आपकी * अजीब * ब्रैकेटिंग शैली ने आपको एक संलग्न ब्लॉक के साथ छोड़ दिया है। (अब, एक ब्रैकेटिंग युद्ध शुरू करने के लिए!) – Axeman

+0

ईक। धन्यवाद एक्समन। – mob

+1

उल्लेखनीय है कि "lib का उपयोग करें" और @INC में हेरफेर करना हमेशा समकक्ष संचालन नहीं होता है। अधिक जानकारी के लिए दस्तावेज़ देखें। – jrockway

12

सीपीएएन पर only प्रगामा है जो एक ही मॉड्यूल के कई संस्करणों को स्थापित करने और फिर उपयोग करने में आसान बनाता है।

3

यदि आपके रनटाइम पर आपका तर्क होता है (उदाहरण के लिए यदि $ नया चर कुछ और जटिल तरीके से उत्पन्न होता है जिसे आप BEGIN ब्लॉक में नहीं चलाना चाहते हैं) तो आप आवश्यकता() लोड कर सकते हैं रनटाइम पर मॉड्यूल।

यह ध्यान रखना होगा कि

use Module; 
use ModuleWithExports qw(export1 export2); 

इसका मतलब है कि आप कर सकते हैं क्रम में अपने कोड चलाने के लिए

BEGIN { require Module; Module->import() } 
BEGIN { 
    require ModuleWithExports; 
    ModuleWithExports->import('export1', 'export2'); 
} 

रूप में एक ही है बस है:

if ($new) { 
    unshift @INC, "newdir"; 
} 
else { 
    unshift @INC, "olddir"; 
} 
require module; 
module->import(); # if necessary 

सीपीएएन से Module::Load मॉड्यूल का उपयोग करने के लिए आवश्यकता() का उपयोग करने का एक विकल्प है।

संबंधित मुद्दे