4

Perl プロジェクトから共通コードを抜き出しています。1 つのメイン プログラムは、いくつかの再利用可能なモジュールに分割する必要があります。

私たちのプログラム名はvalidate_results.pl、一連の検証コマンドを含むものです。これを次のような小さなモジュールに分割する予定validate_results.plです。

use Common::Validate_Results;
use Common::Validate_Results::CommonCommands;
use Common::Validate_Results::ReturnCodeValidation;
...

私の理解では、共通フォルダーを作成する必要があり、その下Validate_Results.pmに存在する必要があります。再びCommonValidate_Resultsフォルダが作成され、その下にCommonCommandsフォルダReturnCodeValidationが存在するはずです。

これらすべてのフォルダーが存在することは必須ですか、それともすべての Perl プログラムを 1 つのフォルダーに入れて論理的にグループ化し、上記の方法を使用してモジュールにアクセスできますか (そのように使用しますcommon::validate_results)。

4

4 に答える 4

6

ファイルシステム階層が必要です。A :: B::Cは常にA/B / C.pm、@INCのどこかに配置されます。

これを回避する必要がある場合は、perldoc -f requireを読んください。具体的には、@INCのサブルーチン参照に関するセクションを探してください。はい、それが本当に必要な場合は、モジュールローダーに奇妙なことをさせることができます。しかし、それはあなたが望むものではありません、私を信じてください。他の99.9999999%のPerlアプリケーションと同様に、規則に固執するだけです。

于 2009-01-22T12:18:40.593 に答える
3

モジュールを「使用」する場合は、構造に準拠する必要があります。それを回避したい場合は、代わりにモジュールを「require」して、requireにファイル名を渡すことができます。

ただし、実際にはこれを行うべきではありません。本当にディレクトリ構造が必要ない場合は、モジュール名から削除してください(ただし、CPANのより一般的なものと競合するモジュール名がある場合は、将来的に問題が発生する可能性があります)。Find :: Binを介してscriptsディレクトリをINCパスに追加し、モジュールを直接使用するだけです。

use FindBin;
use lib $FindBin::Bin;

use ValidateResults;
use CommonCommands;
use ReturnCodeValidation;

HTH

于 2009-01-22T12:27:24.570 に答える
0

「use」コマンドのパッケージ名は、事実上、.pm ファイルで終わる単なるパスであるため、すべてのパッケージの名前を持つフォルダーは必要ありません。あなたの例では、フォルダーが必要です。

Common
Common/Validate_Results

ただし、フォルダーは必要ありません。

Common/Validate_Results/CommonCommands
Common/Validate_Results/ReturnCodeValidation

.pm ファイル内の実際のパッケージ名は、それをロードする「use」コマンド内の名前と同じである必要はありません。ただし、パスをパッケージ名と一致させることは常に良い考えです。

于 2009-01-27T03:55:42.937 に答える