4

私たちが perl に不慣れで、素晴らしいモジュールを書いたとしましょうMyModule.pmmyscript.plまた、このモジュールを使用する必要がある優れたスクリプトも作成しました。

use strict;
use warnings;
use MyModule;
etc...

ここで、dir を作成/home/user/GreatScriptし、そこにファイルを配置します。そして走ろうとするとmyscript.pl……

cd /home/user/GreatScript
perl myscript.pl

すごい!現在、別のディレクトリに移動しています...

cd /
perl /home/user/GreatScript/myscript.pl

あまり役に立たないエラー@INCとパスのリストを取得しています。これは何ですか?グーグルで@INC調べたところ、モジュールを検索するパスが含まれていることがわかりました。このエラーは、Perl が MyModule.pm を見つけられないことを意味します。

これで、次のことができます。

  • システムPERL5LIB varへのパスを追加します。これにより、パスが先頭に追加され@INC ます。モジュールを次のいずれかのディレクトリにインストールします@INC
  • Add to our script セクションに@INCパスを手動で追加しますが、見栄えが悪いです。スクリプトを別のディレクトリに移動するとどうなりますか?BEGINuse lib '/home/user/GreatScript';
  • または、FindBinmodule を使用して現在のディレクトリを検索し、このパスを で使用しますがuse lib "$FindBin::Bin";、100% 効果的ではありません。たとえば、mod_perl のバグや問題などです ...
  • または、__FILE__ (または $0) 変数を使用し、モジュールのabs_pathメソッドを使用してそこからパスを抽出しCwdます。さらに別の自転車のように見えますか?
  • または、いくつかの忘れ物または行方不明 (何か見逃したことがありますか?)

この明白で定期的な操作に多くの作業が必要なのはなぜですか? スクリプトが 1 つあれば簡単ですが、すべてのスクリプトにこの数行のコードを追加する必要があるのはなぜでしょうか。そして、それは100%機能しません!@INC"." の場合のように、perl がデフォルトで現在のスクリプト ディレクトリを追加しないのはなぜですか?

PS: 質問に対する回答を探していましたが、上記のリストと他のいくつかのソリューションのリストしか見つかりませんでした。この質問が重複していることを願っています...

4

3 に答える 3

5

または、いくつかの忘れ物または行方不明 (何か見逃したことがありますか?)

別のオプション:モジュールをスクリプトと一緒に保持しないでください。モジュールは再利用できるように分けているので、ライブラリフォルダに入れておきます。これは、個人プロジェクト用のローカル ライブラリに含まれるuse lib(そして、おそらくプロジェクト用に設定した環境変数を参照する) ものから、モジュールを CPAN ライブラリに作成するもの、およびモジュールの移動先をcpan管理するものまで、何でもかまいません。何をするかは、スクリプトがコードをどのように使用するかを超えて、コードがどれだけ再利用可能かによって異なります。

この明白で定期的な操作に多くの作業が必要なのはなぜですか?

物事のスキームでは、それほど多くの作業はありません。ファイル システムでグループ化されたファイルは、言語レベルで解決するために Perl によって自動的に使用される必要がある、requireまたはuseステートメントが正しくないというあなたの期待は正しくありません。それが不可能だとか、あなたの期待が不合理だということではなく、単に Perl がそのように実装されていないということです。事後に変更すると、既存のプロジェクトの数に影響を与える可能性があり、論争の的となる可能性があります。

于 2013-11-01T09:53:20.993 に答える
4

ユースケースが次のような場合: 「同じディレクトリまたは相対ディレクトリ内の追加モジュールまたは他のリソースにアクセスするスクリプトが必要で、すべてをインストールしたくない」場合、FindBin は完璧なソリューションです。マンページに記載されている制限は、mod_perl のような永続的な環境でのみ発生しますが、ここでは別の解決策を提案します (たとえば、スクリプト/モジュールではなく、httpd.conf 内でのみ FindBin を使用します)。

(/me は FindBin のヘビー ユーザーであり、FindBin マンページの KNOWN ISSUES セクションの半分の著者でもあります)

于 2013-11-01T13:03:19.337 に答える
2

これは、使用したいモジュールを知るために必要です。あなたが言ったように別のカタログに移動すると、perl は '.' を検索します。カタログなので、実行すると:

cd /
perl /home/user/GreatScript/myscript.pl

'/' 内の MyModule.pm が Perl によって検出され、 で使用される場合myscrpit.pl。Perl が @INC 内のモジュールを見つけて、その中のどのカタログを順番に検索するかで、@INC を監視する必要があります。

要約: 使用したいものと同じ名前の間違ったモジュールを使用しないようにするためには、明白で定期的な操作が必要です。

于 2013-11-01T09:46:34.060 に答える