如何在Perl中使用'our'变量

如何在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 **

我有以下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是启动记录器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”)}输入一个方法。奇怪为什么