2009-04-29 9 views
10

私は利用可能ないくつかのモジュールに依存する小さなPerlスクリプトを書いています。そのため、インストール中に、そこにすべてがあるかどうかを確認する必要があります。私はちょうどuse some::moduleと書くことができますが、エラーが出てくるかどうかを確認します。しかし、 "あなたはいくつかのモジュールをインストールする必要があります"というような短いメッセージは、エンドユーザにとってはより役に立ちます。Perlモジュールがインストールされているかどうかを確認するにはどうすればよいですか?

また、すべてのディレクトリを@INCで検索することもできますが、Perlの方が簡単な方法が必要です。

+1

perlモジュールがインストールされているかどうかを確認する方法は質問ではなく、それが声明です。 – cjk

答えて

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

ご迷惑をおかけします。私は一回限りの事例で知りたいと思っていましたが、回復可能な方法でそれを発見しませんでした。

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が二重の義務を果たしていることに注意してください。それはあなたが任意のモジュールをチェックできるようにしており、use文がBEGINブロックに変わるのを防ぎます。結論は、このようなコードを書こうとしたが、特定のモジュールのためにハードコードされていれば、それでも文字列ベースの評価を使用することです。 – chaos

+1

私はあなたの答えが好きでした。なぜなら、これをbashから理解したいからです。しかし、私は議論を必要とするモジュールに困っています。例えば[jens @ ca60c173(perl)p] $ perl -MPackage :: DeprecationManager -e ';' Package :: DeprecationManagerを-e行0にインポートするときは、ハッシュリファレンス-deprecationsパラメータを指定する必要があります。 –

3

:あなたはこのように使用

sub try_load { 
    my $mod = shift; 

    eval("use $mod"); 

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

:私はこのような何かを常にを使用しますしかし、私はこれをコーンシェル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 
} 
+1

インポートを呼び出す必要があります。使用を模倣し、最後に追加すると良いです真の値を返す必要があります:eval {require Some :: Module;いくつか::モジュール - >インポート; 1};これは、evalがインポートされてからevalが終了したときにスコープから外れるため、モジュールが字体的(autoboxのような)であれば十分ではありません。 –

1

:どの程度

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

スクリプトをどのようにインストールしていますか?標準のMakefile.PLまたはBuild.PLを使用している場合、 のリストの依存関係は簡単です。

2

システム上のすべての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ループの中で、いくつかのことをしたいと思うかもしれません。

私は cpanユーティリティを使用したい
my $match; 
if ($module =~ /$match/) { 
    print "Found $match: $module\n"; 
} 
1

% 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ミラー。 :)

関連する問題