パッケージを作成するには、パッケージ名のフォルダーが存在する必要がありますか?
質問
Perlプロジェクトから共通コードを抽出しています。 1つのメインプログラムを複数の再利用可能なモジュールに分割する必要があります。
プログラム名はvalidate_results.pl
で、検証コマンドのセットが含まれています。 Validate_Results.pm
が次のようになるように、これを小さなモジュールに分割することを計画しています:
use Common::Validate_Results;
use Common::Validate_Results::CommonCommands;
use Common::Validate_Results::ReturnCodeValidation;
...
私の理解では、Commonフォルダを作成し、その下にCommon
が存在する必要があります。再びValidate_Results
の下に、CommonCommands
フォルダーが作成され、その下にReturnCodeValidation
およびcommon::validate_results
フォルダーが存在する必要があります。
これらのすべてのフォルダーが存在することは必須ですか、またはすべてのPerlプログラムを単一のフォルダーに入れて論理的にグループ化し、上記の方法を使用してモジュールにアクセスできますか? / p>
解決
ファイルシステム階層が必要です。 A :: B :: Cは常にA / B / C.pm、@ INCのどこかにあります。
これを回避するために持っている場合は、 perldoc -fをお読みください。 require 、特に@INCのサブルーチン参照に関するセクションを探します。はい、本当に必要な場合は、モジュールローダーに奇妙なことをさせることができます。しかし、それはあなたが望むものではありません、私を信頼してください。 Perlアプリケーションの他の99.9999999%がそうであるように、慣習に従うだけです。
他のヒント
モジュールを「使用」する場合は、構造に準拠する必要があります。それを回避したい場合は、代わりにモジュールを「要求」して、ファイル名をrequireに渡すことができます。
しかし、これを行うべきではありません。本当にディレクトリ構造を持ちたくない場合は、モジュール名から削除します(ただし、CPANのより一般的なものと競合するモジュール名があると、将来的に問題が発生する可能性があります)。 Find :: Binを介してINCパスにスクリプトディレクトリを追加し、モジュールを直接使用します。
use FindBin;
use lib $FindBin::Bin;
use ValidateResults;
use CommonCommands;
use ReturnCodeValidation;
HTH
モジュールの例と同じファイル内のサブモジュール:
package Foo;
use strict;
use Exporter 'import';
our @EXPORT = ( 'from_foo' );
sub from_foo { print "from_foo\n"; }
package Foo::Bar;
use strict;
use Exporter 'import';
our @EXPORT = ( 'from_foo_bar' );
sub from_foo_bar { print "from_foo_bar\n"; }
1;
プログラムで、モジュール Foo (.pmファイルのあるモジュール)を使用する場合:
use Foo;
正規名(Foo :: Bar :: from_foo_bar)としてのみを除き、 Foo :: Bar 関数にアクセスできます。次のようにインポートできます:
use Foo;
Foo::Bar->import;
これを実行できないことに注意してください:
use Foo::Bar;
ファイルがないため、 Foo / Bar.pm 。
「use」コマンドのパッケージ名は、実質的に.pmファイルで終わる単なるパスであるため、すべてのパッケージの名前を含むフォルダーは必要ありません。この例では、フォルダーが必要です:
Common
Common/Validate_Results
ただし、フォルダーは必要ありません:
Common/Validate_Results/CommonCommands
Common/Validate_Results/ReturnCodeValidation
.pmファイルの実際のパッケージ名は、それをロードする「use」コマンドの名前と同じである必要はありません。ただし、パッケージ名とパスの一貫性を保つことは常に良い考えです。