2 Stimmen

Wie verwende ich "unsere" Variablen in Perl?

Ich habe folgende PL- und PM-Dateien

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

Code-Auszug aus 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 ist ein benutzerdefiniertes Modul, das ich mit Log4Perl geschrieben habe.

Code-Auszug aus BL.PM

Package BL
use strict;
use Logger;
use ConfigReader;

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

Codeauszug aus Start.PL

Start.PL ist der Einstiegspunkt zu meiner Anwendung, die Logger, ConfigReader

use strict;
use ConfigReader;
use Logger;
use BL;

&Logger::InitiateLogger();
&ConfigReader::OpenConfigIni("My_Config.ini");
my %qhash = %{$ConfigReader::configIni->param( -block => "ABC")}; 

Das Problem ist

Wenn ich Start.PL ausführe, schlägt der Code mit folgender Fehlermeldung fehl

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.

(Zeilennummern ignorieren)

Sie zeigt in BL.pm auf Folgendes

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

Wenn ich kommentiere use Bl in start.Pl funktioniert das Skript einwandfrei, was bedeutet

my %qhash = %{$ConfigReader::configIni->param( -block => "ABC")}; funktioniert problemlos in Start.PL

Was ich hier zu erreichen versuche, ist, dass

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

Was könnte hier das Problem sein?

2voto

Peder Klingenberg Punkte 34969

Die Initialisierung von %chash passiert, wenn BL.pm geladen wird. Dies geschieht als Teil der use BL; in Start.PL. Wie Sie sehen können, hat die Ausführung von Start.PL zu diesem Zeitpunkt noch nicht den Aufruf von OpenConfigIni , so dass die $ConfigReader::configIni ist noch nicht initialisiert worden.

En %qhash Die Initialisierung in Start.pl erfolgt nach dem Aufruf der Config-Initialisierung, also funktioniert das.

Wie Sie bereits festgestellt haben, ist die Initialisierung %chash aus einer Funktion funktioniert. Die Initialisierung Ihrer verschiedenen Module explizit durch Initialisierungsfunktionen ist IMO der bessere Stil, als sich auf die Ladefolge zu verlassen, um die Initialisierungen richtig zu machen. Und das Mischen und Anpassen funktioniert nicht so gut, wie Sie gesehen haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X