加載我目前有一堆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的功能,後面我可能會發現它有用;如果我不能進行重構,這將如何解決?