2016-08-19 15 views
0

私はPerlでかなり新しく、これについてアドバイスが必要です。perlモジュールの外部confファイル

私はスクリプトScript.pl "パス1"にあります。 さらに、ModuleA.pmのモジュールが「パス2」にあります。 最後に、ModuleB.pmという共通モジュールが「パス3」にあります。このModuleBは一般的で、他のパスの他のスクリプトがそれを使用します。 すべてのパスが異なります。 Script.plはModuleAを使用し、ModuleAはModuleBを使用します。

モジュールBに外部設定ファイルを入れる必要があります。このconfファイルは同じ「パス3」にあります。 「私はScript.plをコンパイルした場合ので、可能性があるためコンパイルされません?

use strict; 
require "conf.cfg"; 

がどのように動的な方法としてModuleBでconf.cfgを含めることができますconf.cfgはModuleBに必要とされます現在ModuleBのパスは "パス1"で、 "パス1"にはconfファイルが存在しないため、conf.cfgを見つけることはできません。

したがって、ModuleBを使用する* .plおよびパスとは独立して、confファイルが必要です。

私は十分にクリアでしたか?

ありがとうございます。

答えて

1

更新  追加されたコードモジュールの位置が更新(終了時の別のセクション)に移動させることができるので、それをハードコーディングを避けるために、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.plPath1/内側から)を実行

use feature 'say'; 
say "This is conf.cfg"; 

This is conf.cfg


注意を/pathがどのPath2Path3開始からディレクトリへのパスを指定する文字列リテラルであるライン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コアモジュールのいずれかの機能を使用できます。

+0

@ h3g0r_私が問題を理解しているとは確信していません。私がこの問題の解決に役立つかどうか、また追加または説明が必要かどうかを教えてください。 – zdim

+0

それは問題です。しかし、ModuleBを使用するすべてのスクリプト(.pl)を変更できないため、私のシナリオは異なります。そのため、私はModuleBだけを変更したい。私は、使用する人とは関係なく、ModuleBにconfファイルを "include"または "require"したいと思っています。ファイルとしてmoduleB.pmの "pwd"のようなもの。それをしてもいいですか?あなたの助けをたくさんありがとう –

+0

@ h3g0r_ああ。だからあなたはModuleBだけを編集できます、それは正しいのですか?実際の階層は何ですか?スクリプトに触れる必要はありません。plが実行されるとパスが見つかるかもしれません。設定ファイルが 'require'されたときに完全なパスを指定するだけです。あなたはあなたが持っているものに変更するためだけに、 'require" Path3/conf.cfg "'で上記を試しましたか? – zdim

関連する問題