|
|
|
|
Bonjour,
je cherche à savoir si l'on peut intercepter une erreur dans le cas où un module CPAN n'est pas accessible dans un script perl :
Ex :
use lib"/mod/Date-Calc-5.4/lib/site_perl/5.8.0/aix-thread-multi"; use Date::Calc qw(:all);Si le module Date n'est pas accessible sur cette machine, comment le savoir ?
"Les cons, ça ose tout. C'est même à ça qu'on les reconnait"
On progresse :-)
#use lib"/mod/Date-Calc-5.4/lib/site_perl/5.8.0/aix-thread-multi";
$toto = 0;
BEGIN {
unless (eval "require Date::Calc") {
$toto = 1;
#warn "le module Date ne peut pas être chargé : $@";
}
}
if ($toto != 1) {use Date::Calc qw(:all);}Mais ça plante à la dernière ligne (if ... use date), on dirait qu'il le charge avec ou sans test...
A+ Blux "Les cons, ça ose tout. C'est même à ça qu'on les reconnait" |
Salut,
#!/usr/bin/perl
use strict;use warnings;
our $toto;
BEGIN {
$toto = 0;
print "avant $toto\n";
unless (eval "require Date::Calc") {
$toto = 1;
warn "***le module Date ne peut pas être chargé***\n";
}
print "après $toto\n";
}
if ($toto != 1) {use Date::Calc qw(:all);}
print "ok, je continue\n"
__END__
Exécution lami20j@debian:~/trash$ perl ccm.pl avant 0 ***le module Date ne peut pas être chargé*** après 1 Can't locate Date/Calc.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl /usr/local/lib/perl/5.8.4 /usr/local/share/perl/5.8.4 .) at ccm.pl line 13. BEGIN failed--compilation aborted at ccm.pl line 13. Explication C'est normal d'avoir toujours le message d'erreur use charge le module à la compilation et pas à l'exécution, donc même si ta variable de teste change le compilateur s'en fiche complètement. Cas2 #!/usr/bin/perl
use strict;use warnings;
our $toto;
BEGIN {
$toto = 0;
print "avant $toto\n";
unless (eval "use Date::Calc") {
$toto = 1;
warn "***le module Date ne peut pas être chargé***\n";
}
print "après $toto\n";
}
print "ok, je continue\n"
__END__
_
Exécution lami20j@debian:~/trash$ perl ccm.pl avant 0 ***le module Date ne peut pas être chargé*** après 1 ok, je continue Explication La variable $toto ne sers à rien, c'est juste pour te montrer qu'elle change. Si eval réussi alors le module est chargé sinon un message de warning est affiché et le script continue lami20j |
Regarde un exemple
#!/usr/bin/perl
BEGIN {
unless (eval "use Date::Calc") {
warn "***le module $module ne peut pas être chargé***\n";
}else {
@f = (2007, 1, 1); # 1 Jan 2007
@d = (2000, 10, 20); # 20 Oct 1973
$diff = Delta_Days(@d, @f);
print "Difference $diff jours entre d et f\n";
}
}
print "ok, je continue\n"
__END__
je n'ai pas installé Date::Calc et voilà le résultat chez moi
lami20j@debian:~/trash$ perl ccm.pl ***le module ne peut pas être chargé*** ok, je continuelami20j |
Voilà, en fait j'ai anticipé ta question et j'étais en train de préparer le code :-))
lami20j@debian:~/trash$ cat ccm.pl
#!/usr/bin/perl
use strict; use warnings;
my $toto; # variable locale au paquetage
BEGIN {
my $val = \$toto; # j'utilise une référence vers $toto
unless (eval "use Date::Calc") {
$$val=1; # j'attribue 1 à $toto
warn "***le module Date::Calc ne peut pas être chargé***\n";
}else {
$$val=0; # j'attribue 0 a $toto
}
}
print "ok, je continue \$toto vaut $toto\n";
if ($toto != 1){ # ici ton flag (si $toto différent de 1, donc module chargé)
my @f = (2007, 1, 1); # 1 Jan 2007
my @d = (2000, 10, 20); # 20 Oct 1973
my $diff = Delta_Days(@d, @f);
print "Difference $diff jours entre d et f\n";
}
__END__
lami20j@debian:~/trash$ perl ccm.pl
***le module Date::Calc ne peut pas être chargé***
ok, je continue $toto vaut 1
à testé avec module installé, je l'ai testé sans avoir le module installé
lami20j |
Salut à vous,
#!/usr/bin/perl
use strict; use warnings;
my $toto; # variable locale au paquetage
BEGIN {
my $val = \$toto; # j'utilise une rérérence vers $toto
if (eval "use Date::Calc qw/Delta_Days/") {
$$val=1; # j'attribue 1 Ã| $toto
warn "***le module Date::Calc ne peut pas étre chargé***\n";
}else {
$$val=0; # j'attribue 0 a $toto
}
}
print "ok, je continue \$toto vaut $toto\n";
if ($toto != 1){ # ici ton flag (si $toto différent de 1, donc module chargé)
my @f = (2007, 1, 1); # 1 Jan 2007
my @d = (2000, 10, 20); # 20 Oct 1973
my $diff = Delta_Days(@d, @f);
print "Difference $diff jours entre d et f\n";
}
__END__
lami20j |
Bon j'ai refait un test, ça ne marche pas chez moi :
#!/usr/bin/perl
#use lib"/nsr/tools/eject/Date-Calc-5.4/lib/site_perl/5.8.0/aix-thread-multi";
my $toto; # variable locale au paquetage
BEGIN {
my $val = \$toto; # j'utilise une rérérence vers $toto
if (eval "use Date::Calc qw/Delta_Days/") {
$$val=1; # j'attribue 1 Ã| $toto
warn "***le module Date::Calc ne peut pas étre chargé***\n";
}else {
$$val=0; # j'attribue 0 a $toto
}
}
print "ok, je continue \$toto vaut $toto\n";
if ($toto != 1){ # ici ton flag (si $toto différent de 1, donc module chargé)
my @f = (2007, 1, 1); # 1 Jan 2007
my @d = (2000, 10, 20); # 20 Oct 1973
my $diff = Delta_Days(@d, @f);
print "Difference $diff jours entre d et f\n";
}
__END__Du coup, je coince un peu et je ne peux pas installer le module 'officiellement' :-)
A+ Blux "Les cons, ça ose tout. C'est même à ça qu'on les reconnait" |
Salut,
|