2009-04-29 6 views
10

मैं एक छोटी पर्ल स्क्रिप्ट लिख रहा हूं जो कुछ मॉड्यूल पर निर्भर करता है जो उपलब्ध हो सकता है, इसलिए स्थापना के दौरान मुझे यह जांचना होगा कि वहां सब कुछ है या नहीं। मैं सिर्फ use some::module लिख सकता हूं और देख सकता हूं कि कोई त्रुटि आती है, लेकिन "आपको कुछ :: मॉड्यूल इंस्टॉल करने की आवश्यकता है" जैसे एक संक्षिप्त संदेश एंडुसर के लिए अधिक उपयोगी होगा।मैं कैसे जांचूं कि एक पर्ल मॉड्यूल स्थापित है या नहीं?

मैं भी @INC में प्रत्येक निर्देशिका को खोज सकता हूं, लेकिन जैसा कि यह पर्ल है, वहां एक आसान तरीका होना चाहिए।

+1

यह जांचने के लिए कि कोई पर्ल मॉड्यूल स्थापित है या नहीं, यह एक कथन है। – cjk

उत्तर

19
perl -MSome::Module -e ';' 

ओह, प्रश्न को गलत तरीके से पढ़ें। मैंने सोचा था कि आप एक ऑफ-ऑफ उदाहरण में जानना चाहते थे, इसे पुनर्प्राप्त करने योग्य तरीके से नहीं खोज रहे थे।

sub try_load { 
    my $mod = shift; 

    eval("use $mod"); 

    if ([email protected]) { 
    #print "\[email protected] = [email protected]\n"; 
    return(0); 
    } else { 
    return(1); 
    } 
} 

जो तुम इस तरह का उपयोग करें::

$module = 'Some::Module'; 
if (try_load($module)) { 
    print "loaded\n"; 
} else { 
    print "not loaded\n"; 
} 
+1

यहां ध्यान देना चाहते हैं कि eval डबल ड्यूटी कर रहा है: यह आपको मनमाने ढंग से मॉड्यूल की जांच करने की अनुमति दे रहा है, और यह उपयोग कथन को BEGIN ब्लॉक में बदलने से रोक रहा है। उपरोक्त है, अगर आप इस तरह के कोड लिखना चाहते थे लेकिन एक विशिष्ट मॉड्यूल के लिए हार्डकोड किया गया था, तो भी आप स्ट्रिंग-आधारित eval का उपयोग करेंगे। – chaos

+1

मुझे आपका जवाब पसंद आया, क्योंकि मैं इसे बाश से समझना चाहता हूं, हालांकि, मुझे तर्क की आवश्यकता वाले मॉड्यूल के साथ परेशानी हो रही है। जैसे [जेन्स @ ca60c173 (perl) पी] $ perl -MPackage :: DeprecationManager -e ';' पैकेज :: आयात करने पर आपको हैश संदर्भ-डीप्र्रेकेशन पैरामीटर प्रदान करना होगा। –

3

कैसे के बारे में:

BEGIN { 
    my $module_name = shift; # @ARGV 
    our $module_exp = $module_name; 
    eval "use $module_name;"; 
} 

$module_exp =~ s{::}{/}g; 
foreach my $key (grep { m/^$module_exp\./ } keys %INC) { 
    print "$key => $INC{$key}\n"; 
} 

:

die "Some::Module missing!" unless(eval{require Some::Module}); 
+1

यदि आप उपयोग की नकल करने जा रहे हैं और अंत में एक जोड़ना चाहते हैं तो आयात आयात करने की आवश्यकता है क्योंकि आयात नहीं है एक वास्तविक मूल्य वापस करने के लिए आवश्यक: eval {कुछ :: मॉड्यूल की आवश्यकता है; कुछ :: मॉड्यूल-> आयात; 1}; यह मॉड्यूल प्रकृति (जैसे ऑटोबॉक्स) में अक्षीय है, यह पर्याप्त नहीं होगा क्योंकि यह eval में आयात करेगा, तब जब eval समाप्त होता है तो दायरे से बाहर निकलें। –

1

मैं कुछ इस तरह का उपयोग मैं हमेशा कुछ इस तरह का उपयोग करें लेकिन मैं इसे कॉर्न शैल एफ के रूप में उपयोग करता हूं एकीकरण:

function wherperl 
{ 
    perl -M$1 <<EX_DOC 
    my \$module = '$1'; 
    \$module =~ s/::/\\//g; 

    for (keys %INC) { 
     next unless m/^\$module\./; 
     print \$_ . ' => ' . \$INC{\$_} . "\n"; 
    } 
EX_DOC 
} 
3

आप अपनी स्क्रिप्ट कैसे स्थापित कर रहे हैं? यदि आप मानक Makefile.PL या Build.PL का उपयोग कर रहे हैं, लिस्टिंग निर्भरता मामूली है।

2

मेरे पास एक छोटी सी स्क्रिप्ट है जो मेरे सिस्टम पर सभी पर्ल मॉड्यूल सूचीबद्ध करती है;

#!/usr/bin/perl 

use ExtUtils::Installed; 
my $instmod = ExtUtils::Installed->new(); 
foreach my $module ($instmod->modules()) { 
    my $version = $instmod->version($module) || "???"; 
    print "$module -- $version\n"; 
} 

उस foreach पाश के अंदर आप कुछ चीज करना चाहेंगे;

my $match; 
if ($module =~ /$match/) { 
    print "Found $match: $module\n"; 
} 
1

मैं cpan उपयोगिता का उपयोग करना चाहते:

% cpan -D YAML 
YAML 
------------------------------------------------------------------------- 
    YAML Ain't Markup Language (tm) 
    A/AD/ADAMK/YAML-0.70.tar.gz 
    /usr/local/perls/perl-5.10.0/lib/site_perl/5.10.0/YAML.pm 
    Installed: 0.68 
    CPAN:  0.70 Not up to date 
    Ingy dot Net (INGY) 
    [email protected] 

यह एक छोटे से धीमी गति से, क्योंकि यह एक CPAN दर्पण से कनेक्ट करने के डेटा के कुछ लाने के लिए है हो सकता है, लेकिन मैं यह भी एक स्थानीय है सीपीएएन दर्पण। :)

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