加载我目前有一堆Perl代码,其中包含类似于导出大量其他模块正在使用的变量的configuration.pm文件。同一模块至少使用一个模块,将其称为Foo,我们在配置中提供的一些辅助方法中编写了它(它们应该位于不同的模块中,但尚未准备好进行更改)。允许更改位置perl模块使用配置参数
目前,它加载模块像靠近文件顶部这一权利:
Begin{ push @INC, 'hard/coded/directory'}
use Module::Foo;
我试图摆脱这种硬编码目录。我已经添加了一个默认配置文件来从中读取数据。我搬到进口了一些,取而代之的是一个要求,像这样使用...
$script_directory = $config_data_from_file{'script_directory'};
push @inc, $script_directory;
require Module::Foo;
不过,我想添加一个命令行参数Main.pl如果我指向一个不同的配置文件不想使用默认的。我的问题是,所有其他模块希望配置.pm一旦包含配置数据和所需的foo。所以我不能有configuration.pm等待初始化,直到main.pl准备就绪。我可以拿出最接近的是这样的:
package Configuration;
load_config_file('default/file/location');
sub load_config_file($){
$config_data_from_file = read_file(@_[0]);
$script_directory = $config_data_from_file{'script_directory'};
push @inc, $script_directory;
require Module::Foo;
#load the rest
}
,并有Main.pl召回load_config_file如果命令行选项更改配置文件。
但这是一个问题,有两个原因。首先,如果我的默认脚本位置不存在,当我尝试执行第一次导入时,仍会爆炸。其次,我需要两次Foo,覆盖它,如果文件之间存在差异,可能会导致问题。为此,应该避免将默认script_directory添加到@INC。
有几种方法可以解决我能看到的问题。一种更加干净地加载不同版本的模块以替换旧版本的方法,一种使Foo延迟加载的方式,直到它第一次在文件中使用它,或者一种方法来延迟$ load_config_file方法,直到我读取例如配置文件。然而,作为perl的新手,我不知道如何去做任何一个,也没有太多的运气来发现如何在线。
我现在实际上可以做到这一点,加载数据的一个脆弱的顺序,通过重构几十个脚本来更快地实现长期解决方案(但我很害怕触及)在我有办法测试我的计算机上的代码之前,有很多代码)。然而,我想部分地希望学习更多Perl的功能,后面我可能会发现它有用;如果我不能进行重构,这将如何解决?