我在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文件。
我很清楚?
提前致谢。
答案 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
是一个文字字符串,用于指定Path2
和Path3
开始的目录路径。请参阅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::Spec
或File::Basename
核心模块中的函数来代替这样做。