我正在編寫一個小的Perl腳本,它依賴於某些可能可用的模塊,因此在安裝過程中,我將不得不檢查是否有所有的東西。我只能寫use some::module
,看看是否出現錯誤,但是像「你需要安裝一些::模塊」這樣的短消息對於最終用戶會更有幫助。如何檢查Perl模塊是否安裝?
我也可以搜索@INC
中的每個目錄,但是因爲它是Perl,所以必須有一個更簡單的方法。
我正在編寫一個小的Perl腳本,它依賴於某些可能可用的模塊,因此在安裝過程中,我將不得不檢查是否有所有的東西。我只能寫use some::module
,看看是否出現錯誤,但是像「你需要安裝一些::模塊」這樣的短消息對於最終用戶會更有幫助。如何檢查Perl模塊是否安裝?
我也可以搜索@INC
中的每個目錄,但是因爲它是Perl,所以必須有一個更簡單的方法。
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";
}
這裏需要注意的是,eval正在執行雙重任務:它允許您檢查任意模塊,並且阻止使用語句變成BEGIN塊。 Upshot是,如果您要編寫像這樣的代碼,但爲特定模塊進行硬編碼,則仍然使用基於字符串的eval。 – chaos 2009-04-29 19:09:14
我喜歡你的答案,因爲我想從bash中弄清楚這一點,但是,我遇到了模塊需要參數的麻煩。例如[jens @ ca60c173(perl)p] $ perl -MPackage :: DeprecationManager -e';' 在導入Package :: DeprecationManager時,必須在-e行0處提供散列引用-deprecations參數。 – 2013-04-05 08:38:57
如何:
die "Some::Module missing!" unless(eval{require Some::Module});
我用的是這樣的:
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";
}
但我更多地使用korn shell f的形式
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
}
你是如何安裝腳本的?如果您使用的是標準的Makefile.PL或Build.PL,則 列出的依賴關係是微不足道的。
我有一個腳本,列出了我係統上的所有Perl模塊;
#!/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";
}
我喜歡用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鏡獲取一些數據,但我也有一個地方CPAN鏡像。 :)
如何檢查是否安裝了perl模塊不是一個問題,它是一個聲明。 – cjk 2009-04-29 12:27:08