perl模块中的外部conf文件

时间:2016-08-19 04:02:39

标签: perl module config

我在Perl中很新,请为此提出建议。

我在" 路径1 "中有一个 Script.pl 脚本。 此外,我在" 路径2 "中有一个模块 ModuleA.pm 。 最后,我在" 路径3 "中有一个共同的模块 ModuleB.pm 。这个ModuleB是常见的,其他路径中的其他脚本使用它。 所有路径都是不同的。 Script.pl使用ModuleA,ModuleA使用ModuleB。

我需要在ModuleB中放置一个配置的外部文件。此conf文件位于"路径3"中。在ModuleB中需要conf.cfg:

use strict;
require "conf.cfg";

如何将conf.cfg作为动态方式包含在ModuleB中?因为如果我编译Script.pl,则无法编译,因为无法找到conf.cfg,因为现在是ModuleB路径是"路径1"并且在"路径1" conf文件不存在。

所以我需要独立于使用ModuleB的* .pl和路径的conf文件。

我很清楚?

提前致谢。

1 个答案:

答案 0 :(得分:1)

更新添加了代码以在ModuleB运行时获取require路径,以避免对其进行硬编码,因为模块的位置可能会在更新中移动(单独的部分位于结束)。

在需要时指定conf.cfg的完整路径。

考虑以下层次结构和文件,其中所有路径均从/path/

开始
/path/Path1/script.pl 
/path/Path2/ModuleA.pm 
/path/Path3/ModuleB.pm 
/path/Path3/conf.cfg

script.pl

use warnings;
use lib '/path';
use Path2::ModuleA;

文件 Path2 / ModuleA.pm

package ModuleA;    
use warnings;
use Path3::ModuleB;
1;

文件 Path3 / ModuleB.pm

package ModuleB;
use warnings;
require "Path3/conf.cfg";
1;

档案路径3 / conf.cfg

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

运行script.pl(从Path1/内部)打印行This is conf.cfg

注意行use lib '/path',其中/path是一个文字字符串,用于指定Path2Path3开始的目录路径。请参阅lib pragma

  

它通常用于向perl的搜索路径添加额外的目录,以便以后使用或require语句可以找到不在perl的默认搜索路径上的模块。

使用相对于脚本所在位置的库路径可以更容易。在script.pl

# Load relative path for modules.
use FindBin qw($Bin);
use lib "$Bin/../lib";
use Path2::ModuleA;
# ...

在这种情况下,模块的Path2(等)从目录../lib开始,相对于脚本的位置

./bin/script.pl
./lib/Path2/ModuleA.pm
./lib/Path3/...

我选择了名称bin作为示例。请参阅核心模块FindBin

这个简短的说明几乎没有涉及如何组织模块的表面。

评论中出现了一个特定的约束。 ModuleB存在于可能随未来更新而变化的路径中,因此在require语句中对该路径进行硬编码并非最佳。

一种解决方案是在运行时ModuleB内找到路径,并在require中使用该路径。这可以使用Perl的特殊文字 __FILE__完成。

文件 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;

需要核心模块Cwd中的abs_path,因为__FILE__可能不会返回绝对路径。用于查找目录的正则表达式本身匹配到/ 贪婪的所有内容,一直到最后/ - 因此整个路径没有文件名本身。您可以使用File::SpecFile::Basename核心模块中的函数来代替这样做。