2011-01-23 21 views
7

मैं टर्मिनल आउटपुट के रंगीनकरण के लिए मेरी पर्ल स्क्रिप्ट में Term::ANSIColor का उपयोग कर रहा हूं, और मैं colorstrip फ़ंक्शन का उपयोग कर रहा हूं, जिसे चेंजलॉग के अनुसार Term::ANSIColor संस्करण 2.01 में जोड़ा गया था। तो, क्या मेरी स्क्रिप्ट स्वचालित रूप से die उचित त्रुटि संदेश के साथ बनाने का कोई तरीका है यदि इसे कम से कम Term::ANSIcolor का संस्करण नहीं मिलता है?मैं अपने पर्ल स्क्रिप्ट में एक पर्ल मॉड्यूल के एक निश्चित संस्करण (या उच्चतर) का उपयोग कैसे करूं?

उत्तर

21

बस:

use Term::ANSIColor 2.01; 

perldoc -f use देखें:

उपयोग मॉड्यूल संस्करण सूची

तो संस्करण तर्क मॉड्यूल और सूची के बीच मौजूद है, तो उपयोग कॉल करेंगे दिए गए संस्करण के साथ एक तर्क के रूप में कक्षा मॉड्यूल में संस्करण विधि। यूनिवर्सल क्लास से विरासत में मिली डिफ़ॉल्ट संस्करण विधि, यदि दिया गया संस्करण परिवर्तनीय $ मॉड्यूल :: संस्करण के मान से बड़ा है।

7

अधिकांश मॉड्यूल पैकेज चर $VERSION परिभाषित करते हैं।

use Term::ANSIColor; 
die "Sorry, this program needs Term::ANSIColor >= v2.01!\n" 
    unless $Term::ANSIColor::VERSION >= 2.01; 

यह भी एक अधिकतम एक मॉड्यूल के संस्करण निर्दिष्ट करने के लिए एक अच्छा तरीका है।

use Module::Foo; 
die "You need an *older* version of Module::Foo that ", 
    "still has the &barbaz method defined" 
    if $Module::Foo::VERSION >= 0.47; 
+0

यह करने का यह एक अच्छा तरीका है। जब आप आयात सूची में कोई संस्करण प्रदान करते हैं, तो आप वास्तव में इसे प्रबंधित करने वाली आयात विधि पर भरोसा करते हैं। इतना ही नहीं, आयात तकनीक केवल उस संस्करण या बाद में आवश्यक है। यदि आप एक विशेष संस्करण या संस्करणों की श्रृंखला चाहते हैं, तो आप इस सामान्य तकनीक के साथ समाप्त हो जाते हैं। –

+1

दरअसल 'आयात' विधि से कोई मदद की आवश्यकता नहीं है - जब आप 'उपयोग' या' आवश्यकता 'का उपयोग किसी संस्करण संख्या के साथ करते हैं, तो' VERSION' विधि पर एक कॉल उत्पन्न होता है। लेकिन प्रत्येक पैकेज जो विशेष रूप से ओवरराइड नहीं करता है, उसे 'यूनिवर्सल' से उपयुक्त 'संस्करण' विधि मिलती है। – hobbs

+0

@brian शायद आपको पिछले संदेश पर टैग करना चाहिए था, इसलिए अब मैं हूं :) – hobbs

2

, बस संस्करण आप उपयोग करना चाहते निर्दिष्ट करें: संस्करण में कम से कम 2.13 नहीं है, तो

use Some::Module 2.13; 

, आपरेशन असफल हो जायेगी।

आपको उस संस्करण का कमांड लाइन पर उपलब्ध है के साथ प्रयोग कर सकते हैं:

perl -MSome::Module=9999 -e 'exit 0' 

यह आमतौर पर (त्रुटि संदेश में दिखाया गया है जब तक कि मॉड्यूल आप का उपयोग करने की कोशिश कर रहे हैं होता है गलत संस्करण संख्या के साथ मर जाएगा 5 अंक या लंबा संस्करण संख्या होने के लिए, या जब तक कि मॉड्यूल strict जैसा न हो और किसी संस्करण संख्या के साथ कमांड लाइन के माध्यम से लोड नहीं किया जा रहा हो या URI (विवरण के लिए टिप्पणियां देखें))।

$ perl -MFile::Find=999 -e 'exit 0' 
File::Find version 999 required--this is only version 1.07 at 
/usr/perl5/5.8.4/lib/Exporter/Heavy.pm line 121. 
BEGIN failed--compilation aborted. 
$ perl -e 'use File::Find 999; exit 0' 
File::Find version 999 required--this is only version 1.07 at -e line 1. 
BEGIN failed--compilation aborted at -e line 1. 
$ 

एक मशीन पर चलाएं जिसका मैं सामान्य रूप से उपयोग नहीं करता, इसलिए पर्ल का पुरातन संस्करण।

+3

दोनों अलग-अलग हैं; कमांड लाइन -एम स्विच कभी भी उपयोग करने के लिए एक संस्करण निर्दिष्ट नहीं करता है; इसके बजाए यह मॉड्यूल के आयात दिनचर्या के पैरामीटर के रूप में आपूर्ति करता है, और मॉड्यूल जो एक्सपोर्टर का उपयोग करते हैं, फिर संस्करण जांच करते हैं। लेकिन सभी मॉड्यूल निर्यातक का उपयोग नहीं करते हैं। – ysth

+0

यह सभी मॉड्यूल के साथ भरोसेमंद काम नहीं करता है, इसलिए यह एक सामान्य तकनीक नहीं है, जैसा कि ysth कहते हैं। –

+1

@ysth और @brian: ठीक है - मैं इसके लिए अपना शब्द लेता हूं; मैंने सीपीएएन में प्रत्येक मॉड्यूल पर इसे आजमाया नहीं है, लेकिन एकमात्र बार जब मैं संस्करण संख्याओं के साथ किसी समस्या में भाग लेता हूं, वह मुख्य मॉड्यूल के उप-मॉड्यूल के साथ होता है जो विश्वसनीय रूप से अपना स्वयं का संस्करण सेट नहीं करता है। क्या आप एक उदाहरण या दो मॉड्यूल दे सकते हैं जहां यह काम नहीं करता है? –

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