OVH Cloud OVH Cloud

utilisation de do

6 réponses
Avatar
Serge Basterot
Salut,

Faisant suite à mon message de ce matin, j'ai déplacé un hash contenant
des infos utilisateurs dans un fichier séparé de mon cgi. J'ai donc dans
un fichier config.pl (qui ne contient que ceci) :

%usersdb = (
user1 => {
domain => "schmurtz.net",
realname => "Toto Machin",
aliases => [ qw( toto tmachin ) ],
}
user2 => {
domain => "tata.com",
realname => "Tata Truc",
aliases => [ qw( tata ttruc ) ],
}
);

et l'appel correspondant dans le cgi :

do 'config.pl';

[...]

$q->table(
$q->Tr(
{-align => 'left', -valign => 'top'},
[
$q->th([ "Nom réel", "Adresse principale", "Alias" ]),
map {$q->td([ $usersdb{$_}{realname}, $_ . "@" . $usersdb{$_}{domain}, join ", ",@{$usersdb{$_}{aliases}} ]) } keys %usersdb,
]
),
);

Et maintenant j'ai :
Global symbol "%usersdb" requires explicit package name...

Je dois me tromper dans l'utilisation de do afin de bien initialiser
le hash mais je ne vois pas comment. Je pensais bien suivre pourtant
ce que dit le cookbook et le perldoc -f do. J'ai dû faire une erreur
d'appréciation, mais laquelle ?

Merci d'avance,

--
Serge

6 réponses

Avatar
Denis -esp2008-
Bonjour,

Global symbol "%usersdb" requires explicit package name...


Cela est normal, parce que do " executes the contents of the file as a
Perl script" comme le dit bien perldoc, donc n'inclut pas le script en
question mais ce contente de l'exécuter.
Il vaut mieux regarder du côté de require.

Bonne chance,

--
Denis

Avatar
Serge Basterot
On 2005-04-12, Denis -esp2008- wrote:
Bonjour,

Global symbol "%usersdb" requires explicit package name...


Cela est normal, parce que do " executes the contents of the file as a
Perl script" comme le dit bien perldoc, donc n'inclut pas le script en
question mais ce contente de l'exécuter.
Il vaut mieux regarder du côté de require.


C'est noté, je te remercie.

--
Serge


Avatar
Samuel Mouni
On 2005-04-12, Denis -esp2008- w rote:
Bonjour,

Global symbol "%usersdb" requires explicit package name...


Cela est normal, parce que do " executes the contents of the file as a
Perl script" comme le dit bien perldoc, donc n'inclut pas le script en
question mais ce contente de l'exécuter.
Il vaut mieux regarder du côté de require.


C'est noté, je te remercie.


require est un do .

d'apres perldoc :

Otherwise, demands that a library file be included if it hasn’t alr eady
been included. The file is included via the do-FILE mechanism, which is
essentially just a variety of "eval". Has semantics similar to the
following subroutine:

sub require {
my ($filename) = @_;
if (exists $INC{$filename}) {
return 1 if $INC{$filename};
die "Compilation failed in require";
}
my ($realfilename,$result);
ITER: {
foreach $prefix (@INC) {
$realfilename = "$prefix/$filename";
if (-f $realfilename) {
$INC{$filename} = $realfilename;
$result = do $realfilename;
last ITER;
}
}
die "Can’t find $filename in @INC";
}

if ($@) {
$INC{$filename} = undef;
die $@;
} elsif (!$result) {
delete $INC{$filename};
die "$filename did not return true value";
} else {
return $result;
}
}

Note that the file will not be included twice under the same specified
name.


.s'nuoM



Avatar
Denis -esp2008-
Bonsoir,

require est un do .


Effectivement, j'ai répondu un peu vite, parce que le problème était
signalé comme provenant du do (je viens de tester et il ne vient pas de
là, d'ailleurs chez moi ça ne pose aucun problème le script en question).

--
Denis
Promo de Denis en ce moment sur fclp en ce moment: pour une réponse
donnée, une connerie dite, profitez-en!

Avatar
Alex Marandon
On 2005-04-12, Serge Basterot wrote:

Bonsoir Serge,

des infos utilisateurs dans un fichier séparé de mon cgi. J'ai donc dans
un fichier config.pl (qui ne contient que ceci) :

%usersdb = (
[...]

et l'appel correspondant dans le cgi :

do 'config.pl';
[...]

Global symbol "%usersdb" requires explicit package name...


Je vois plusieurs solutions :

- indiquer explicitement le nom de package comme le dit le message d'erreur :

%main::usersdb

- désactiver le controle sur les variable avec un

no strict 'vars';

avant l'appel de ta variable

- déclarer l'utilisation de la variable de package avec

use vars qw(%usersdb);

en début de script

Je préfère la dernière.

Avatar
Laurent Wacrenier
Serge Basterot écrit:
Faisant suite à mon message de ce matin, j'ai déplacé un hash contenant
des infos utilisateurs dans un fichier séparé de mon cgi. J'ai donc dans
un fichier config.pl (qui ne contient que ceci) :

%usersdb = (
user1 => {
domain => "schmurtz.net",
realname => "Toto Machin",
aliases => [ qw( toto tmachin ) ],
}
user2 => {
domain => "tata.com",
realname => "Tata Truc",
aliases => [ qw( tata ttruc ) ],
}
);

et l'appel correspondant dans le cgi :

do 'config.pl';



On peut aussi faire comme ça :
dans config.pl :

(
user1 => { ... }
);

dans le CGI :

%usersdb = do 'config.pl';

ce qui évite de déclarer des variables.