[Perl] Librairie et fonctions

Librairie et fonctions [Perl] - Perl - Programmation

Marsh Posté le 31-07-2006 à 12:01:36    

Bonjour,
 
j'ai défini des fonctions dans un module... TestLib.pm, avec un package TestLib. Par exemple test, qui appelle &erreur en cas d'erreur :D
 
J'appelle ces fonctions dans script1.pl, script2.pl voire script3.pl
 
Dans script1, script2 et script3, la fonction erreur est définie différemment.
 
Bien entendu le problème qui se pose est que lors de l'appel de test, la fonction &erreur est inconnue.
 
Est-ce que c'est possible ?
 
Rappel :
TestLib.pl

Code :
  1. use lib "..\\lib";
  2. use TestLib ;
  3. sub erreur {
  4. print "erreur\n";
  5. }
  6. &test ;


 
TestLib.pm :

Code :
  1. package TestLib ;
  2. use Exporter ;
  3. our @ISA = qw (Exporter );
  4. our @EXPORT = qw / test / ;
  5. sub test {
  6. &erreur ;
  7. }

Reply

Marsh Posté le 31-07-2006 à 12:01:36   

Reply

Marsh Posté le 02-08-2006 à 10:36:07    

Bonjour,
 
une bonne habitude à prendre, lorsque tu as fait un package (ou .pm) et que tu l'utilises avec un de tes programmes, c'est d'appeler les fonctions de ce package en les préfixant du nom du package.
 
Exemple :  
 

Code :
  1. use TestLib;
  2. # appel de la fonction 'erreur' du package TestLib
  3. TestLib::erreur( );


 
Ca te permet de savoir en un seul coup d'oeil que la fonction appelée dans ton script n'est pas inclue dans celui-ci.
 
Et ça protège également une fonction erreur() que tu aurais codé en plus dans ton script.
 
Je sais pas si je suis bien clair là ? :)


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 02-08-2006 à 10:43:16    

Pour être plus clair dans mon exemple :
 
monscript.pl :

Code :
  1. #!/usr/bin/perl -w
  2. use MaLibPerso;        # voir code suivant
  3. # appel à fonction Erreur incluse dans CE script
  4. Erreur( );
  5. # appel à fonction Erreur issue du package MaLibPerso
  6. MaLibPerso::Erreur( );
  7. # fonction interne Erreur
  8. sub Erreur
  9. {
  10.     print "Erreur !\n";
  11.     return;
  12. }


 
b]MaLibPerso.pm :[/b]

Code :
  1. package MaLibPerso;
  2. use vars qw(@ISA @EXPORT);
  3. use Exporter;
  4. @ISA = qw(Exporter);
  5. @EXPORT = qw(Erreur);
  6. # fonction du package Erreur
  7. sub Erreur
  8. {
  9.     print "Erreur !\n";
  10.     return;
  11. }
  12. 1;


 
C'est pitet' plus clair là, non ?  :)


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 02-08-2006 à 10:49:52    

Je poursuis mes investigations  :D  
 
Attention, tu ne peux pas avoir une fonction dans un script .pl qui est appelée et utilisée dans un package .pm.
 
Par contre, tu peux très bien avoir cette fonction stockée dans un package et utiliser ce package via un use classique dans un autre package.
 
Pour te donner un ordre d'idée, j'utilise dans presque tous mes programmes le package outils.pm, lequel contient diverses fonctions générales comme :
- me retourner l'heure actuelle
- me retourner la date du jour
- procédure automatique pour se connecter à une BDD MySql
 
Etc etc.
 
Certaines des fonctions de outils.pm sont utilisées dans d'autres packages. Et ça marche très bien, à condition toutefois dans tes packages d'inclure un use outils.pm;
 
 :)


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 02-08-2006 à 15:37:28    

package XXX::Utils;
 
BEGIN {
  use Exporter ();
  @XXX::Utils::ISA = qw(Exporter);
  @XXX::Utils::EXPORT_OK  = qw(formatDate listbox invHash searchEltArray testNum GetSession EndSession js_changetop js_frameredirect return_listbox );
  @XXX::Utils::EXPORT  = qw();
}
 
apres tu mets tes focntions... déclarées ci dessus


Message édité par Madking le 02-08-2006 à 15:38:44
Reply

Marsh Posté le 02-08-2006 à 15:37:52    

ca te permet d exporter tes fonctions de ton package

Reply

Marsh Posté le 03-08-2006 à 11:30:00    

Ok merci à vous deux !  
Mais ça ne m'aide pas plus :(
 
Je ne pourrais pas déclarer une fonction erreur dans la librairie et la "surcharger" dans le programme ?
 
Non probablement :/
Tant pis, je vais faire autrement !  
 
Ma fonction erreur est semblable dans 70% des cas, je vais la définir dans la librairie, pour les autres cas, je la définirai dans le programme idoine :D
Avec l'appel lib::erreur, je ne confondrais pas ;)
 
Merci :D

Reply

Marsh Posté le 03-08-2006 à 11:35:16    

nibbles1 a écrit :

Je ne pourrais pas déclarer une fonction erreur dans la librairie et la "surcharger" dans le programme ?


 
Qu'est-ce que tu entends par "surcharger" ?
 
Tu veux une fonction capable de recevoir des arguments ou non ?
 
Si oui, tu peux très bien avoir ta fonction erreur() dans ton package lib (donc, la fonction lib::erreur), laquelle peut très bien bosser avec ou sans paramètres (arguments).
 
Exemple :
 

Code :
  1. # exemple de fonction faisant un die ( )
  2. sub Erreur
  3. {
  4.     my $ErrorMessage = shift();
  5.     if (defined ($ErrorMessage))
  6.     {
  7.         print "Erreur de traitement : $ErrorMessage\n";
  8.     }
  9.     else
  10.     {
  11.         print "Erreur de traitement\n";
  12.     }
  13.     exit();
  14. }


 
Mise en situation :
 

Code :
  1. # Erreur sans argument fourni
  2. Erreur();
  3. # Erreur avec argument
  4. Erreur("Zut, ca coince !" );
  5. # en sortie (sur l'écran), ça donnera
  6. Erreur de traitement
  7. Erreur de traitement : Zut, ca coince !

Message cité 1 fois
Message édité par Aricoh le 03-08-2006 à 11:37:14

---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 03-08-2006 à 11:55:11    

Aricoh a écrit :

Qu'est-ce que tu entends par "surcharger" ?
 
Tu veux une fonction capable de recevoir des arguments ou non ?


 
Ce que je voudrais, c'est que mes différentes fonctions erreur définies dans mes programmes puissent être appelées via les fonctions de la librairie. Or ça n'a pas l'air possible. Après l'histoire des arguments, je vois pas trop le rapport :D
 
Quand je disais "suarcharger", je voulais dire :
- définir une fonction erreur dans le package (qui ne fait rien, mais est juste là pour être définie)
- définir mes fonctions erreur dans les programmes
- à l'exécution du programme, on appelle une fonction de la librairie, si on tombe sur un appel de la fonction erreur, par magie il appel la fonction erreur du programme [:tatanka]  
 
Si je suis assez clair, tu seras d'accord pour dire que c'est pas du tout faisable n'est-ce pas ?  [:coch]  
 
Je vais donc faire autrement ;)
 
Merci encore !

Reply

Marsh Posté le 06-08-2006 à 20:49:19    

nibbles1 a écrit :


Ce que je voudrais, c'est que mes différentes fonctions erreur définies dans mes programmes puissent être appelées via les fonctions de la librairie. Or ça n'a pas l'air possible. Après l'histoire des arguments, je vois pas trop le rapport :D
 
Quand je disais "suarcharger", je voulais dire :
- définir une fonction erreur dans le package (qui ne fait rien, mais est juste là pour être définie)
- définir mes fonctions erreur dans les programmes
- à l'exécution du programme, on appelle une fonction de la librairie, si on tombe sur un appel de la fonction erreur, par magie il appel la fonction erreur du programme [:tatanka]  
 
Si je suis assez clair, tu seras d'accord pour dire que c'est pas du tout faisable n'est-ce pas ?  [:coch]  
 
Je vais donc faire autrement ;)
 
Merci encore !


 
 
Si c'est possible mais il faut jouer avec les namespaces :
 

Code :
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use TestLib ;
  4. sub erreur {
  5.     print "erreur\n";
  6. }
  7. &test;


 

Code :
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use TestLib ;
  4. &test;


 

Code :
  1. package TestLib ;
  2. use Exporter ;
  3. our @ISA = qw (Exporter );
  4. our @EXPORT = qw / test / ;
  5. sub erreur {
  6.   print "default error\n";
  7. }
  8. sub test {
  9.   if (defined (&::erreur)){
  10.     &::erreur;
  11.   } else {
  12.    erreur();
  13.   }
  14. }


 
Je critique pas...


---------------
Cdl, Danjer
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed