a BEGIN
blockを使用して独自の検証を構築できます。それらはコンパイル時に実行され、ちょうどuse
のようです。
BEGIN {
require Foo;
Foo->import;
}
次のコードは、単一BEGIN
ですべてuse
文を置き換えるとeval
内でそれらを配置します:use Foo
は、本質的に、このように他ならないことに注意してください。これは本質的にtry/catchメカニズムのようなものです。
は、私たちは、引数がa barewordある場合のみ、パスにコロン::
とパッケージ名から変換しrequire
ので(この辺り悪と考えられている)文字列eval
を必要としています。しかし、$module
に名前があるので、それは文字列なので、に従ってeval
に配置する必要があります。
文字列eval
が失敗した場合は、die
です。それは外側のeval
ブロックによって捕らえられ、[email protected]
が設定されています。モジュール名が含まれているかどうかを確認することができます。この場合、そのモジュールがインストールされていないために失敗したと考えられません。この小切手はもう少し精巧であるかもしれません。
私たちは$fails
の失敗を追跡し、もしあれば、私たちは停止します。私は私が持っていないASDF
を、含ま上
#!/usr/bin/perl
use strict;
use warnings;
# all our use statements go here
BEGIN {
my $fails;
foreach my $module (qw/Digest::MD5 File::DosGlob ASDF/) {
eval {
eval "require $module" or die; # because $module is not a bareword
$module->import;
};
if ([email protected] && [email protected] =~ /$module/) {
warn "You need to install the $module module";
$fails++;
}
}
exit if $fails;
}
# ...
ので、実行するとき、それはあなたが/home/code/scratch.plライン1335で空自モジュールをインストールする必要が
言うだろう。
メッセージをもう少し冗長にしたい場合があります。ユーザーがPerlがモジュールを見つけることができないときに出るデフォルトのエラーメッセージを理解できない場合は、そこに物事をインストールする方法に関するガイドを含むことが賢明かもしれません。
リストされた両方のモジュールがa whileのPerlに含まれていることに注意してください(2002年3月以降読んでください)。では、なぜこれらのモジュールでこれをしたいのですか?
$ corelist Digest::MD5
Data for 2014-09-14
Digest::MD5 was first released with perl v5.7.3
$ corelist File::DosGlob
Data for 2014-09-14
File::DosGlob was first released with perl 5.00405
より良い方法をインストールすることができ分布として、あなたのプログラムを出荷し、Makefileのかcpanfileや依存関係を示しています似たようなを含めるだろう。新しいモジュールを起動する方法については、perlnewmodのガイドがあります。明らかにCPANにアップロードしたくないのですが、基本は同じです。
このようにすると、すべての依存関係が自動的にインストールされます。
_perlnewmod_に言及してくれてありがとう。私はいつもCPANがどのように埋められているのか疑問に思いました。 – PerlDuck
その文書@PerlDuckだけではありません。新しいディストリビューションを開始するためのさまざまなツールや、いくつかのガイドがあります。多分、これはCPANで何かをリリースする良い時期です。 PAUSEアカウントを作ってみましょう。 :) – simbabque
私はmakefileやcpanfileに慣れていないので、Beginは1つのファイルのために働いています。ありがとうございます。しかし、フォルダ内のすべてのperlファイルをチェックするにはどうすればいいのですか? – VSr