我有以下PL和PM文件
Start.PL,ConfigReader.PM,BL.PM,Logger.PM
ConfigReader.PM的代码摘录
Package ConfigReader
use Config::Simple;
use Logger;
our $configIni;
sub OpenConfigIni()
{
my ($cfg_ini_path)=@_;
&Logger::LogMsg("**** OpenConfigIni starts ****","info");
&Logger::LogMsg($cfg_ini_path,"info");
$configIni = new Config::Simple($cfg_ini_path);
&Logger::LogMsg("**** OpenConfigIni ends ****","info");
}
其中Logger.PM是我使用Log4Perl编写的自定义模块。
来自BL.PM的代码摘录
Package BL
use strict;
use Logger;
use ConfigReader;
my %chash = %{$ConfigReader::configIni->param( -block => "UserDetails")};
Start.PL的代码摘录
Start.PL是我的应用程序的入口点,它启动了Logger,ConfigReader
use strict;
use ConfigReader;
use Logger;
use BL;
&Logger::InitiateLogger();
&ConfigReader::OpenConfigIni("My_Config.ini");
my %qhash = %{$ConfigReader::configIni->param( -block => "ABC")};
问题是
当我运行Start.PL时,代码失败并显示以下错误
Can't call method "param" on an undefined value at BL.pm line 9
Compilation failed in require at Start.pl line 19.
BEGIN failed--compilation aborted at Start.pl line 19.
(忽略行号)
它指向以下BL.pm
my %chash = %{$ConfigReader::configIni->param( -block => "UserDetails")};
如果我在start.Pl中评论use Bl
,则脚本正常工作意味着
my %qhash = %{$ConfigReader::configIni->param( -block => "ABC")};
在Start.PL
我想在这里实现的是
1. Use the ConfigReader.PM for handling the configuration related
2. Make use of the our $configIni in all modules
3. Initialing the Logger and ConfigReader form start.pl whioch is the entry point here
这可能是什么问题?
答案 0 :(得分:2)
加载BL.pm时会发生%chash
的初始化。这是Start.PL中use BL;
的一部分。如您所见,此时Start.PL的执行尚未到达OpenConfigIni
的调用,因此$ConfigReader::configIni
变量尚未初始化。
Start.pl中的%qhash
初始化发生在配置初始化调用之后,因此可以正常工作。
正如您所发现的,从函数初始化%chash
有效。通过初始化函数显式初始化各种模块是IMO比依赖加载顺序更好的样式,以使初始化正确。正如你所见,混合和匹配效果不佳。