|
|
|
|
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"
Salut,
tu peux utiliser le bloc BEGIN BEGIN {
unless (eval "require $m") {
warn "le module $m ne peux pas être chargé : $@";
}
}ou<code>BEGIN {
unless (eval "use $m") {
warn "le module $m ne peux pas être chargé : $@";
}
}</code>
lami20j |
On progresse :-)
En fait, je voudrais savoir si le module est présent et positionner un flag dans ce cas, pour traiter ensuite des cas particuliers et charger mon module date : #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" |
Mais ça plante à la dernière ligne (if ... use date), on dirait qu'il le charge avec ou sans test...
déjà il faut faire un print $toto pour voir s'il est vraiment différent de 1 lami20j |
Ben il est égal à 0...
Donc il semble ne pas passer dans le unless (j'ai mis le use lib en commentaire...) ??? A+ Blux "Les cons, ça ose tout. C'est même à ça qu'on les reconnait" |
je vais vérifier à la maison
tu as quelle version de Perl? lami20j |
This is perl, v5.8.0 built for aix-thread-multiMerci de ton aide :-) A+ Blux "Les cons, ça ose tout. C'est même à ça qu'on les reconnait" |
Salut,
Cas1 #!/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 |
Donc, ça me va, s'il charge le module, je positionne mon flag et je joue avec ensuite...
Je teste ça dès demain... A+ Blux "Les cons, ça ose tout. C'est même à ça qu'on les reconnait" |
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 |
Ok, j'avais pas bien vu, alors comment positionner un flag quand le module n'est pas chargé, car je ne veux pas mettre tout mon code dans le 'else' ?
A+ Blux "Les cons, ça ose tout. C'est même à ça qu'on les reconnait" |
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 |
car je ne veux pas mettre tout mon code dans le 'else' ?
Et, pourquoi pas? D'ailleurs avec le flag tu le mets dans un if () { } :-))) lami20j |
Je me penche sur ton code, j'ai pas tout compris, mais ça doit être normal, moi jeune padawan, pas encore jedi...
A+ Blux "Les cons, ça ose tout. C'est même à ça qu'on les reconnait"
|
Salut à vous,
blux celui là fonctionne, mais ne demande pas pourquoi :-)) #!/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 :
# test1.pl ok, je continue $toto vaut 0 Undefined subroutine &main::Delta_Days called at test1.pl line 19. # C'est sans doute dû au fait que mon module est appelé dans le script et non à l'extérieur... #!/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,
C'est sans doute dû au fait que mon module est appelé dans le script et non à l'extérieur... Ben, ce n'est pas comme ça qu'il faut voir? Le bloc BEGIN s'exécute avant tout, c'est à dire aussi avant la compilation. Tu peux tester une divizion avec zéro dans un bloc BEGIN et tu verras. Comme tu n'as pas donner un signe, je croyais que c'est bon. Je vais prendre ton code et je vais le tester dans plusieurs environnements. lami20j
|
Le qw(/.../), c'est pour donner la liste des modules que l'on appelle ?
Non, c'est pour spécifier à la demande une fonction ou variable à utilisier En général on les trouve dans le tableau @EXPORT_OK du module lami20j |
| 15/04 15h27 | Compresser ses pages en Gzip et tester le résultat | Webmaster |
| 16/06 13h52 | [Debian][HowTo] Xorg7 - installer drivers nvidia | X-Window |
| 18/10 10h56 | Installation serveur Samba | Réseaux |
| 27/02 15h12 | [Linux] Installer les programmes (gestion des paquets, compil) | Linux |
| 13/04 13h40 | Comment vérifier si mon antivirus est actif ? | Virus |
| 06/06 09h31 | [PHP] Tester si un nombre premier | 6 |
| 26/05 12h31 | [DOM] et tester si un attribut existe | 3 |
| 20/05 16h37 | [Perl] Franciser un module | 9 |
| 07/05 13h55 | EXCEL: VBA pour tester si la ligne comporte u | 6 |
![]() | Firstpage - First Page 2006 est un éditeur html gratuit et excellent. Il permet de travailler un code HTML en couleur, ainsi que de... | Catégorie: Editeurs HTML Licence: Freeware/gratuit |
![]() | MOREFUNC (Macro complémentaire EXCEL) - Morefunc est une macro complémentaire proposant 67 nouvelles fonctions de feuille de calcul pour Excel. Ces fonctions sont... | Catégorie: Tableur Licence: Freeware/gratuit |
![]() | Wubi - Pour ceux qui veulent se familiariser avec la manipulation d'Ubuntu, il n’y a pas quatre chemins : on doit tout simplement... | Catégorie: Système Licence: Freeware/gratuit |
![]() | Sjphone - Sjphone est un softphone VOIP ou la voix sur réseau IP qui vous permet de discuter avec un interlocuteur possédant un... | Catégorie: Bureautique Licence: Open Source |
![]() | Infinity Modulus HCS Silver | Catégorie: Enceintes | |
![]() | Harman Kardon AVR140 Black/Silver | Catégorie: Ampli tuner | 1,469.00 € Alapage |
![]() | Onkyo TX-SR304 Silver | Catégorie: Ampli tuner | 200.99 € MisterGoodDeal |
![]() | Kensington Si300 Laser Wired | Catégorie: Souris | 21.00 € Dell Business FR |