如何在Perl中使用'our'变量
我有以下PL和PM文件 Start.PL、ConfigReader.PM、BL.PM、Logger.PM 从ConfigReader.PM中提取代码如何在Perl中使用'our'变量,perl,Perl,我有以下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 **
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是启动记录器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中注释使用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
这里可能有什么问题?加载BL.pm时会初始化%chash
。这是使用BL的一部分代码>在Start.PL中。如您所见,此时Start.PL的执行尚未到达对OpenConfigIni
的调用,因此$ConfigReader::configIni
变量尚未初始化
Start.pl中的%qhash
初始化发生在config初始化调用之后,因此可以工作
正如您所发现的,从函数初始化%chash
是有效的。通过初始化函数显式初始化各个模块比依靠加载顺序来正确初始化要好。正如您所看到的,混合和匹配并没有那么好用。OK在我放置代码my%chash=%{$ConfigReader::configIni->param(-block=>“UserDetails”)}代码>输入一个方法。奇怪为什么