更新 追加されたコードモジュールの位置が更新(終了時の別のセクション)に移動させることができるので、それをハードコーディングを避けるために、require
ために実行時にModuleB
パスを取得します。
conf.cfg
のフルパスを指定します。
は
package ModuleA;
use warnings;
use Path3::ModuleB;
1;
メイン
script.pl
use warnings;
use lib '/path';
use Path2::ModuleA;
ファイルパス2/ModuleA.pm
/path/Path1/script.pl
/path/Path2/ModuleA.pm
/path/Path3/ModuleB.pm
/path/Path3/conf.cfg
すべてのパスが/path/
から起動する場合は、次の階層とファイルを考えてみましょう
ファイルPATH3/ModuleB.pm
package ModuleB;
use warnings;
require "Path3/conf.cfg";
1;
ファイルPATH3/confに。CFG script.pl
(Path1/
内側から)を実行
use feature 'say';
say "This is conf.cfg";
線This is conf.cfg
注意を/path
がどのPath2
とPath3
開始からディレクトリへのパスを指定する文字列リテラルであるラインuse lib '/path'
を印刷します。 lib
プラグマを参照してください
典型的には、その後で使用するので、perlの検索パスに余分なディレクトリを追加したり、Perlのデフォルトの検索パス上に配置されていないモジュールを見つけるのステートメントを必要とするために使用されます。
スクリプトがどこにあるのかに関連したライブラリパスを使用する方が簡単です。スクリプトは、私は、例として名前bin
を選ん
./bin/script.pl
./lib/Path2/ModuleA.pm
./lib/Path3/...
あるモジュール用この場合Path2
(ETC)でscript.pl
# Load relative path for modules.
use FindBin qw($Bin);
use lib "$Bin/../lib";
use Path2::ModuleA;
# ...
においてに対して、ディレクトリ../lib
で開始。コアモジュールFindBin
を参照してください。
このクイックノートでは、モジュールの構成方法についてはほとんど触れていません。
特定の制約がコメントに現れました。 ModuleB
は将来の更新で変更される可能性があるパスに存在するため、require
ステートメントのパスをハードコードするのは最適ではありません。
解決策の1つは、実行時にModuleB
の中にパスがあり、require
で使用されていることです。これは、Perlの特別リテラル__FILE__
を使用して行うことができます。 __FILE__
絶対パスを返さないかもしれないので、コアモジュールCwd
から
ファイルPATH3/ModuleB.pm
package ModuleB;
use warnings;
use strict;
use Cwd qw(abs_path);
my ($this_dir) = abs_path(__FILE_) =~ m|(.*)/|;
require "$this_dir/conf.cfg";
1;
abs_path
が必要です。ディレクトリ自体を見つけるのに使われる正規表現は、/
という貪欲にまで、すべて最後の/
までのすべてのものと一致します。したがって、ファイル名自体のないパス全体です。これを行う代わりに、File::Spec
またはFile::Basename
コアモジュールのいずれかの機能を使用できます。
@ h3g0r_私が問題を理解しているとは確信していません。私がこの問題の解決に役立つかどうか、また追加または説明が必要かどうかを教えてください。 – zdim
それは問題です。しかし、ModuleBを使用するすべてのスクリプト(.pl)を変更できないため、私のシナリオは異なります。そのため、私はModuleBだけを変更したい。私は、使用する人とは関係なく、ModuleBにconfファイルを "include"または "require"したいと思っています。ファイルとしてmoduleB.pmの "pwd"のようなもの。それをしてもいいですか?あなたの助けをたくさんありがとう –
@ h3g0r_ああ。だからあなたはModuleBだけを編集できます、それは正しいのですか?実際の階層は何ですか?スクリプトに触れる必要はありません。plが実行されるとパスが見つかるかもしれません。設定ファイルが 'require'されたときに完全なパスを指定するだけです。あなたはあなたが持っているものに変更するためだけに、 'require" Path3/conf.cfg "'で上記を試しましたか? – zdim