如何在Perl中使用`my`变量

时间:2011-09-28 07:33:17

标签: 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 ****","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

这可能是什么问题?

1 个答案:

答案 0 :(得分:2)

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

Start.pl中的%qhash初始化发生在配置初始化调用之后,因此可以正常工作。

正如您所发现的,从函数初始化%chash有效。通过初始化函数显式初始化各种模块是IMO比依赖加载顺序更好的样式,以使初始化正确。正如你所见,混合和匹配效果不佳。