2 votes

Comment utiliser les variables "our" en Perl ?

J'ai les fichiers PL et PM suivants

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

Extrait de code de 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");
}

Où Logger.PM est un module personnalisé que j'ai écrit en utilisant Log4Perl.

Extrait de code de BL.PM

Package BL
use strict;
use Logger;
use ConfigReader;

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

Extrait de code de Start.PL

Start.PL est le point d'entrée de mon application qui lance Logger, ConfigReader

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

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

Le problème est

Quand j'exécute Start.PL, le code échoue avec l'erreur suivante

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.

(Ignorer les numéros de ligne)

Il pointe vers ce qui suit dans BL.pm

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

Si je commente use Bl dans start.Pl, le script fonctionne bien ce qui veut dire que

my %qhash = %{$ConfigReader::configIni->param( -block => "ABC")}; fonctionne bien dans Start.PL

Ce que j'essaie de faire ici, c'est que

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

Quel pourrait être le problème ici ?

2voto

Peder Klingenberg Points 4675

L'initialisation de %chash se produit lorsque BL.pm est chargé. Ce qui se produit dans le cadre de la use BL; dans Start.PL. Comme vous pouvez le voir, l'exécution de Start.PL à ce moment-là n'a pas encore atteint l'appel à OpenConfigIni donc le $ConfigReader::configIni n'a pas encore été initialisée.

El %qhash L'initialisation dans Start.pl se fait après l'appel d'initialisation de la configuration, donc cela fonctionne.

Comme vous l'avez découvert, l'initialisation %chash à partir d'une fonction fonctionne. Initialiser vos différents modules explicitement par le biais de fonctions d'initialisation est, selon l'OMI, un meilleur style que de compter sur l'ordre de chargement pour obtenir les initialisations correctes. Et le mélange et l'assortiment ne fonctionnent pas si bien, comme vous l'avez vu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X