Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1251 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  [Perl] Librairie et fonctions

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Perl] Librairie et fonctions

n°1416474
nibbles1
Pour la gloire de NFT
Posté le 31-07-2006 à 12:01:36  profilanswer
 

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. }

mood
Publicité
Posté le 31-07-2006 à 12:01:36  profilanswer
 

n°1417978
Aricoh
gentil mais fo po pousser
Posté le 02-08-2006 à 10:36:07  profilanswer
 

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
n°1417985
Aricoh
gentil mais fo po pousser
Posté le 02-08-2006 à 10:43:16  profilanswer
 

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
n°1417989
Aricoh
gentil mais fo po pousser
Posté le 02-08-2006 à 10:49:52  profilanswer
 

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
n°1418258
Madking
Posté le 02-08-2006 à 15:37:28  profilanswer
 

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
n°1418259
Madking
Posté le 02-08-2006 à 15:37:52  profilanswer
 

ca te permet d exporter tes fonctions de ton package

n°1418802
nibbles1
Pour la gloire de NFT
Posté le 03-08-2006 à 11:30:00  profilanswer
 

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

n°1418804
Aricoh
gentil mais fo po pousser
Posté le 03-08-2006 à 11:35:16  profilanswer
 

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
n°1418816
nibbles1
Pour la gloire de NFT
Posté le 03-08-2006 à 11:55:11  profilanswer
 

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 !

n°1421048
Danjer
Posté le 06-08-2006 à 20:49:19  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  [Perl] Librairie et fonctions

 

Sujets relatifs
[RESOLU] pour afficher toutes les fonctionsProblème librairie gd
pb arbre perl gtkFormulaire Perl/CGI générant du XML
[Perl] générer une variable grace à une chaineexecuter un script perl periodiquement
problème avec mon formulaire perl/cgi (debutant)Fonctions dans des variables
Compiler la librairie g2 avec Dev C++fonctions driver réseaux
Plus de sujets relatifs à : [Perl] Librairie et fonctions


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR