2011-09-28 106 views
2

我有以下PL和PM从ConfigReader.PM我如何使用`在Perl

文件

Start.PL,ConfigReader.PM,BL.PM,Logger.PM

代码提取our`变量

Package ConfigReader 
use Config::Simple; 
use Logger; 

our $configIni; 
sub OpenConfigIni() 
{ 
    my ($cfg_ini_path)[email protected]_; 
    &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编写的自定义模块。从Start.PL

Start.PL BL.PM

Package BL 
use strict; 
use Logger; 
use ConfigReader; 

my %chash = %{$ConfigReader::configIni->param(-block => "UserDetails")}; 

代码提取

代码提取物的入口点到我的应用程序,启动记录仪,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

OK可以正常工作,当我把代码'my%chash =%{$ ConfigReader :: configIni-> param(-block =>“UserDetails”)};'inisde一个方法。想知道为什么 – KK99

+1

其Perl不是PERL –

回答

2

当BL.pm被加载时,%chash的初始化发生。这是Start.PL中的use BL;的一部分。如您所见,此时执行Start.PL尚未达到对OpenConfigIni的调用,因此$ConfigReader::configIni变量尚未初始化。

在Start.pl中初始化%qhash发生在配置初始化调用之后,因此可行。

正如你所发现的,从函数初始化%chash的作品。通过初始化函数显式初始化您的各个模块是IMO更好的风格,而不是依赖加载顺序来正确初始化。正如你所看到的那样,混音和匹配不能很好地工作。