2012-04-04 22 views
0

答えがhereであるため、perlモジュールがインストールされているかどうかを検証しようとしています。このため は、私が持っている:スクリプト内にperl modが存在するかどうかのテスト

# &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 ([email protected]) { 
     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; 
     } 
    } 
} 

この予想通りに実行されますが、何らかの理由で、evalの戻り私は実際には、私が行うとき、RRDtoolの:: OOは、インストールされていないこと。

私は空のファイルを作成し、実行した場合:

# File foo.pl 
use strict; 

$| = 1; 

use RRDTool::OO; 

をその後、私はエラーを取得していません。

しかし、私は;,印刷$ @を持つ最初のファイルを実行すると、それが返されます:私は間違って

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

何をしているのですか?あなたは何が起こっている

if (eval("require xxx;")) { 
    print "you have it\n"; 
} else { 
    print "you don't\n"; 
} 

答えて

2

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

が文字列化表現

require "RRDTool::OO" 

ない裸の単語で実行されていることですスタイル

RRDTool/OO.pmというファイルではなく、パスにRRDTool::OOというファイルを探しています。

あなたは、可変式で、実行時にrequireを使用する場合は、あなたがしたいのいずれかrequireにevalの

eval "require $lib" 

または引数を処理するの糸形式を使用します自分が

$lib = "RRDTool::OO"; 
$lib =~ s{::}{/}g; 
eval { require "$lib.pm" } 
+1

そして、 "require"に関するドキュメントをチェックすると、引用符がこの場合に役立つ理由を知ることができます:http://perldoc.perl.org/functions/require.html – oalders

+1

パーフェクト、ありがとう! –

+0

@oaldersはい、私は "正しかった"と書かれたxxxについて考えました。(それは自分自身に何があるかを問わず):evalが成功するかどうかをチェックする方法を指していました。 – ShinTakezou

2

のように、evalの結果をチェックする必要が

関連する問題