OVH Cloud OVH Cloud

use strict

4 réponses
Avatar
ecureuil
bonjour,

Je modifie tous les pgms d'une interface web en ajoutant use strict

J'ai un programme qui a plusieurs require...
un des require est la configuration des variables communes à tous les
programmes de l'interface web...

J'ai par exemple la variable dans wwwconf :
$fax_incoming = '/var/spool/fax/incoming';

je fais donc dans pratiqement tous les pgms : require wwwconf;
pour avoir le chemin des fax entrants...

Comment faire avec use strict?

J'ai naturellement :
Global symbol "$fax_incoming" requires explicit package name at !!!!

Vous programmez comment ce genre de choses?

anne

4 réponses

Avatar
Jérémy JUST
On Tue, 1 Feb 2005 23:32:42 +0100
"ecureuil" wrote:

un des require est la configuration des variables communes à tous les
programmes de l'interface web...

J'ai par exemple la variable dans wwwconf :
$fax_incoming = '/var/spool/fax/incoming';


Tu peux utiliser les noms pleinement qualifiés des variables:

<<<<<
package wwwconf ;

use strict ;

our $fax_incoming = '/var/spool/fax/incoming' ;








je fais donc dans pratiquement tous les pgms : require wwwconf;
pour avoir le chemin des fax entrants...


Puis:

<<<<<
chdir $wwwconfig::fax_incoming ;








Vous programmez comment ce genre de choses?


Pour la configuration, j'ai plutôt tendance à utiliser un hash global
(voir « %ENV », ce qui est très pratique, mais pas forcément très
propre).

--
Jérémy JUST





Avatar
ecureuil
"Jérémy JUST" a écrit dans le message de news:

| On Tue, 1 Feb 2005 23:32:42 +0100
| "ecureuil" wrote:
|
| > un des require est la configuration des variables communes à tous les
| > programmes de l'interface web...
| >
| > J'ai par exemple la variable dans wwwconf :
| > $fax_incoming = '/var/spool/fax/incoming';
|
| Tu peux utiliser les noms pleinement qualifiés des variables:
|
| <<<<<
| package wwwconf ;
|
| use strict ;
|
| our $fax_incoming = '/var/spool/fax/incoming' ;
| >>>>>
|
|
| > je fais donc dans pratiquement tous les pgms : require wwwconf;
| > pour avoir le chemin des fax entrants...
|
| Puis:
|
| <<<<<
| chdir $wwwconfig::fax_incoming ;
| >>>>>
|
|
| > Vous programmez comment ce genre de choses?
|
| Pour la configuration, j'ai plutôt tendance à utiliser un hash global
| (voir « %ENV », ce qui est très pratique, mais pas forcément très
| propre).
|

Je viens encore pour avoir des conseils...!

Je vais essayer d'expliquer ce que j'ai fait...
Ce que je viens de faire fonctionne à peu près!

Je modifie tous les pgms d'une interface web en ajoutant use strict.
Dans l'interface web de départ, il n'y avait ni -w, ni -T ni use strict!
J'ai également ajouter un certain nombre de fonctions dans tous les pgms!

Tous les pgms de l'interface web ont 2 require.
- un pour tous les paramètres de configuration... (chemin d'accès pour lire
les fichiers, chemin pour les pgm employés, ..)
C'est un fichier qui normalement doit se mettre à jour à l'installation de
l'interface selon la distribution utilisée.
- un pour faire des vérifications d'existence de programme, pour imprimer
les messages d'erreur de configuration,...
Dans ce fichier, il n'y a que des sub (fonction) qui sont appelés par tous
les programmes de l'interface web.

Le premier pgm (paramètre de configuration) : wwwconf
(/etc/mgetty+sendfax/)
Le deuxième (fonction) : wwwsub (/usr/lib/mgetty+sendfax)

Je n'ai pas touché à wwwsub

wwwconf :
Je l'ai appelé wwwconf.pm
J'ai ajouté :
package wwwconf;
use strict;
use Exporter;
our @ISA=('Exporter');
our
@EXPORT_OK=('$indexpage','$fax_incoming','$www_logo','%maxpages','$allow_delete_incoming','$delete','$fic_lang_traduc','$lib_ibay');
Pour toutes les variables, j'ai mis "our" devant pour les rendre global...

Pgm de l'interface web :
#!/usr/bin/perl -wT
unshift (@INC, "/etc/mgetty+sendfax"); # y-a un problème!!! (1)
use wwwconf
('$indexpage','$fax_incoming','$www_logo','%maxpages','$allow_delete_incoming','$delete','$fic_lang_traduc','$lib_ibay');
use strict;

# initialisation des données servant dans le pgm avec "my"
my @dx;
my $http_lang;
my $libel_indexpagenot;
my $DATEI;
my %pages;
my %basename;
my %sender;
my %date;
my %datexx;
my $id;
my $protz;
my $date;
...
#----------------------------------------------------------
# GETTEXT
# traitement des variables pour la langue d'affichage
# cela fonctionne bien!
...
# read common subroutine file (toutes les variables dont on se sert dans ce
require ont été déclarées avec our)
require "/usr/lib/mgetty+sendfax/wwwsub.pl";
....
# début traitement

(1) j'avais mis le wwwconf.pm dans "/etc/mgetty+sendfax" mais cela ne
fonctionnait pas... .
msg d'erreur :
Can't locate wwwconf.pm in @INC (@INC contains:
/usr/lib/perl5/5.6.1/i386-linux /usr/lib/perl5/5.6.1
/usr/lib/perl5/site_perl/5.6.1/i386-linux /usr/lib/perl5/site_perl/5.6.1
/usr/lib/perl5/site_perl/5.6.0/i386-linux /usr/lib/perl5/site_perl/5.6.0
/usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.6.1/i386-linux
/usr/lib/perl5/vendor_perl/5.6.1 /usr/lib/perl5/vendor_perl) at
/home/e-smith/files/ibays/fax-voice1/cgi-bin/fax/viewfax.cgi line 52.

Si je fais un print de @INC dans le pgm :
inc : --/etc/mgetty+sendfax /usr/lib/perl5/5.6.1/i386-linux
/usr/lib/perl5/5.6.1 /usr/lib/perl5/site_perl/5.6.1/i386-linux
/usr/lib/perl5/site_perl/5.6.1 /usr/lib/perl5/site_perl/5.6.0/i386-linux
/usr/lib/perl5/site_perl/5.6.0 /usr/lib/perl5/site_perl
/usr/lib/perl5/vendor_perl/5.6.1/i386-linux /usr/lib/perl5/vendor_perl/5.6.1
/usr/lib/perl5/vendor_perl--
--/etc/mgetty+sendfax-- est bien ajouté à @INC et je fais le "use wwwconf "
après le unshift : j'ai dû raté un truc!

J'ai donc copié wwwconf.pm dans un des répertoires présent dans (@INC et
cela fonctionne.

J'aimerai donc avoir vitre avis sur la façon dont j'ai procédé...
Vous feriez comment ce genre de choses?

Merci
anne
Avatar
Denis -esp2008-
Bonjour,

unshift (@INC, "/etc/mgetty+sendfax"); # y-a un problème!!! (1)
use wwwconf


Il me semble que le unshift est traité à l'exécution, alors que le use
l'est à la compilation.

Il faut soit utiliser un require, soit appeler perl avec l'option
-I/etc/mgetty+sendfax ou encore passer par la directive use lib (je ne me
souviens plus du fonctionnement, je suis assez utilisateur du -I bien
qu'il ne soit pas particulièrement recommandé).

Bonne chance,

--
Denis

Avatar
Dav'
J'utilise un bloc BEGIN pour eviter le probleme :

use strict ;
use warning ;

my $extREP;

# Parametre
BEGIN {
$grrLIB = shift ;
}

# Chargement Librairie
use lib ( $grrLIB . "/lib/Perl/" ) ;

Je fais ça car le chemin de mes librairies varie entre les machines et
qu'il est donc dans un fichier de conf.

Par contre je ne sais pas si ça marche à travers un cgi . De plus je
ne suis pas certain de l'impact en terme de performance . D'ailleurs si
quelqu'un en sait quelque chose ...


Dav'