3

私は多数の perl スクリプトを持っています。それぞれに、開発した perl モジュールのパスを @INC に追加する同一の BEGIN セクションが必要です。サブじゃないから単純に呼べない。現在、私はすべての perl スクリプトにこのセクションを含めていますが、これは明らかにメンテナンスの頭痛の種です。BEGIN セクションを含める簡単な方法はありますか?

BEGIN
{
     my $current_script_dir = File::Basename::dirname(File::Spec::Functions::rel2abs($0));

     # Assume that the root of all libraries is two levels up from the directory of the 
     # script being run.

     my $all_libs_root = File::Spec->canonpath("$current_script_dir/../..");

     # Make sure the path is absolute,      
     $all_libs_root = File::Spec->rel2abs($all_libs_root);

     unshift(@INC, "$all_libs_root");
} 
4

1 に答える 1

8

はい。そのコード (BEGIN に入る) を新しい Perl モジュールに入れるだけです。

package MyIncPathMaintenance;
push @INC, "something_bvaluable";
1;

次に、すべてのスクリプトは次のことを行うだけです。

use MyIncPathMaintenance;

シバンの後の最初の行としてuse strict

は( source );use XYZと同等であるため、これは機能します。一方、モジュールのコード(操作を含む)は、評価されたかのように実行されます(source)。BEGIN { require XYZ; XYZ->import() }require@INC

BEGIN + @INCこのアプローチには、変更よりも多くの利点があります。

  • 今後のメンテナンス性が大幅に向上します。パスへの変更 (または新しいパスの追加) は、大量のスクリプト間でコピー/貼り付けされるのではなく、モジュールにカプセル化されます。

  • やや高度な機能がカプセル化されており、自分が何をしているのかを知らないジュニア開発者に公開するのは少し危険であり、それを壊す可能性があります (「ねえ、ホームディレクトリをこのパスに追加して、自分のコア レビュー/テスト/SDLC のリリースなしのアドホック ライブラリ バージョン")。

  • これにより、スクリプトでより高度なロジックを使用できます (この場合、モジュールはベータ スクリプトのベータ ライブラリ パスを自動的に先頭に追加します)。


「MyIncPathMaintenance.pm はどこにあるの?」という質問に対処するには、環境によって異なります。ここでどのように構築されているかについての詳細な議論を見つけることができます@INC: Perl の @INC はどのように構築されていますか? (別名、Perl モジュールが検索される場所に影響を与えるすべての方法は何ですか?)

Perl インタープリターのデフォルト@INCが何であるか、および環境変数を介してどのように影響を与えることができるかを含めます。

于 2013-07-15T18:21:31.207 に答える