2011-01-23 11 views
7

端末出力のカラー化を行うPerlスクリプトでTerm::ANSIColorを使用していて、変更ログに基づいてTerm::ANSIColorバージョン2.01で追加されたcolorstrip関数を使用しています。だから、少なくともTerm::ANSIcolorのバージョンを見つけることができない場合、私のスクリプトを自動的にdieに適切なエラーメッセージを表示する方法はありますか?perlスクリプトで特定のバージョン(またはそれ以上)のperlモジュールを使用するにはどうすればよいですか?

答えて

21

use Term::ANSIColor 2.01; 

perldoc -f useを参照してください:

使用モジュールのバージョンリスト

VERSION引数はモジュールとLISTの間に存在する場合、その使用が呼び出します指定されたバージョンを引数としてModuleクラスのVERSIONメソッドを呼び出します。 UNIVERSALクラスを継承したデフォルトのVERSIONメソッドは、指定されたバージョンが変数$ Module :: VERSIONの値より大きい場合に機能します。

7

ほとんどのモジュールでは、パッケージ変数$VERSIONが定義されています。

use Term::ANSIColor; 
die "Sorry, this program needs Term::ANSIColor >= v2.01!\n" 
    unless $Term::ANSIColor::VERSION >= 2.01; 

これは、モジュールの最大バージョンを指定するための良い方法です。ただ、

use Module::Foo; 
die "You need an *older* version of Module::Foo that ", 
    "still has the &barbaz method defined" 
    if $Module::Foo::VERSION >= 0.47; 
+0

これは良い方法です。インポートリストでバージョンを指定すると、実際にこれを処理するインポートメソッドに依存します。それだけでなく、インポートの手法ではそのバージョン以降が必要です。特定のバージョンやバージョンの範囲が必要な場合は、このより一般的な手法になります。 –

+1

実際には、 'import'メソッドから必要な助けはありません。バージョン番号で' use'または 'require'を使うと、' VERSION'メソッドに呼び出しが生成されます。しかし、特にそれを上書きしないパッケージはすべて、 'UNIVERSAL'から適切な' VERSION'メソッドを取得します。 – hobbs

+0

@brianはおそらく前のメッセージであなたにタグを付けていたはずですので、今私はです:) – hobbs

2

だけで、使用したいバージョンを指定:バージョンが少なくとも2.13でない場合、操作は失敗します

use Some::Module 2.13; 

を。

あなたは、コマンドラインで提供されていたバージョンを試すことができます。

perl -MSome::Module=9999 -e 'exit 0' 

これは通常、使用しようとしているモジュールが起こっていない限り(エラーメッセージに示されている間違ったバージョン番号で死んでしまいます5桁以上のバージョン番号を持つか、またはモジュールがstrictのようなもので、バージョン番号などのコマンドラインでロードされたくない場合はURI(詳細はコメントを参照してください))。

$ perl -MFile::Find=999 -e 'exit 0' 
File::Find version 999 required--this is only version 1.07 at 
/usr/perl5/5.8.4/lib/Exporter/Heavy.pm line 121. 
BEGIN failed--compilation aborted. 
$ perl -e 'use File::Find 999; exit 0' 
File::Find version 999 required--this is only version 1.07 at -e line 1. 
BEGIN failed--compilation aborted at -e line 1. 
$ 

マシンで実行します。通常は使用しません。したがって、古いバージョンのPerlです。

+3

2つは微妙に異なります。コマンドライン-Mスイッチは使用するVERSIONを決して指定しません。モジュールのインポートルーチンにパラメータとして供給し、Exporterを使用するモジュールはバージョンチェックを行います。しかし、すべてのモジュールがExporterを使用するわけではありません。 – ysth

+0

これはすべてのモジュールで確実に動作するわけではないので、一般的な方法ではありません。 –

+1

@ysthと@brian:OK - 私はあなたの言葉を受け取ります。私はCPANのすべてのモジュールで試してみませんでしたが、バージョン番号の問題に遭遇した唯一の時間は、信頼できる独自のバージョンを設定していないメインモジュールのサブモジュールです。モジュールのインスタンスまたは2つが動作しない場所に与えることはできますか? –

関連する問題