Как использовать переменные `our` в Perl - PullRequest
2 голосов
/ 28 сентября 2011

У меня есть следующие файлы 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")};

Если я прокомментирую use Bl в start.Pl, скрипт работает нормально, что означает

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 Ответ

2 голосов
/ 28 сентября 2011

Инициализация %chash происходит при загрузке BL.pm.Что происходит как часть use BL; в Start.PL.Как видите, выполнение Start.PL в этот момент еще не достигло вызова OpenConfigIni, поэтому переменная $ConfigReader::configIni еще не была инициализирована.

Инициализация %qhash в Start.pl происходит после вызова инициализации конфигурации, так что это работает.

Как вы обнаружили, инициализация %chash из функции работает.Явная инициализация ваших различных модулей с помощью функций инициализации является лучшим стилем IMO, чем полагается на порядок загрузки для правильной инициализации.И микширование и сопоставление работают не так хорошо, как вы видели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...