パッケージを作成するには、パッケージ名のフォルダーが存在する必要がありますか?

StackOverflow https://stackoverflow.com/questions/468818

  •  19-08-2019
  •  | 
  •  

質問

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」コマンドの名前と同じである必要はありません。ただし、パッケージ名とパスの一貫性を保つことは常に良い考えです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top