0

ここで提供された回答に基づいて、perlモジュールがインストールされているかどうかを検証しようとしています。このために、私は持っています:

# &getYN and &prompt are only included here for completeness
sub getYN {
    unless ( $autoyes =~ /[Yy]/ ) {
        my ( $prompt, $default ) = @_;
        my $defaultValue = $default ? "[$default]" : "";
        print "$prompt $defaultValue: ";
        chomp( my $input = <STDIN> );
        return $input ? $input : $default;
    } else {
        return "Y";
    }
}

sub prompt {
    my ( $prompt, $default ) = @_;
    my $defaultValue = $default ? "[$default]" : "";
    print "$prompt $defaultValue: ";
    chomp( my $input = <STDIN> );
    return $input ? $input : $default;
}

&chklib("RRDTool::OO");
sub chklib {
    my $lib = shift;
    eval { require $lib; };
    if ($@) {
        print "You are missing a required Perl Module: $lib\n";
        my $ok = &getYN( "Shall I attempt to install it for you?", "y" );
        if ( $ok =~ /[Yy]/ ) {
            require CPAN;
            CPAN::install($lib);
        } else {
            print "Installation requires $lib\n";
            exit;
        }
    }
}

これは期待どおりに実行されますが、実際にはインストールされているのに、何らかの理由でRRDTool::OOがインストールされていないことがevalから返されます。

空のファイルを作成して実行すると、次のようになります。

# File foo.pl
use strict;

$| = 1; 

use RRDTool::OO;

その後、エラーは発生しません。

しかし、print $ @;を使用して最初のファイルを実行すると、次のように返されます。

Can't locate RRDTool::OO in ...

私は何が間違っているのですか?

4

2 に答える 2

2

次のように、評価の結果を確認する必要があります

if (eval("require xxx;")) {
     print "you have it\n";
} else {
     print "you don't\n";
}
于 2012-04-04T17:19:13.963 に答える
2

何が起こっているかというと

$lib = "RRDTool::OO";
eval { require $lib }

文字列化された式で実行されます

require "RRDTool::OO"

ベアワードスタイルではない

require RRDTool::OO

そのため、というファイルではなく、パスで呼び出さRRDTool::OOれたファイルを探しています。@INCRRDTool/OO.pm

実行時に変数式を使用requireしたい場合は、文字列形式の eval を使用する必要があります。

eval "require $lib"

または引数をrequire自分で処理します

$lib = "RRDTool::OO";
$lib =~ s{::}{/}g;
eval { require "$lib.pm" }
于 2012-04-04T17:22:08.303 に答える