IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

[langage] Problème avec appel de fonction via table hash


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 37
    Points : 29
    Points
    29
    Par défaut [langage] Problème avec appel de fonction via table hash
    Bonjour,

    J'utilise une table de hash pour appeler automatiquement une fonction adequate par référence dans un CGI.

    Par contre j'ai un soucis quand c'est une fonction qui n'est pas dans mon CGI en cours, mais dans un module.

    Ci-joint la syntaxe du prog :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    my %ListeOperations = (
         'ajoutertitre' => \&inserer_titre_liste,
         'ajouterliste' => \&ajouter_liste,
         'supprimertitre' => \&effacer_titre_liste,
    );
     
    while(my($actualOperation,$function) = each %ListeOperations) {
     
       if ($_operation eq $actualOperation) {
     
          $bd->$function->(...); # ... represente mes arguments que j'ai enlevés
       }
    }
    Le problème est sur $bd->$function->(..). Il s'attend à trouver la fonction dans le CGi et pas dans l'objet $bd créé précédament.

    j'obtiens l'erreur : Undefined subroutine &main::inserer_titre_liste called at ...

    Comment faire dans ce cas là ?

    Merci

    [balise code par Choupi]

  2. #2
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Question sans doute bete, mais tu as beaucoup de fonctions ? si la reponse est non, pourquoi ne pas les inclure directement ? C'est sans doute une volonté de ta part... ?
    MacOS 10.5 / Ubuntu / C / Python / R
    Pensez au tag résolu

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par Choupi
    Question sans doute bete, mais tu as beaucoup de fonctions ? si la reponse est non, pourquoi ne pas les inclure directement ? C'est sans doute une volonté de ta part... ?
    Bonjour,

    Ce module "maison" en question représenté par l'objet $bd contient pas mal de fonctions (830 lignes de codes) de manipulation de tables d'une BD sous MySQL.

    Ce petit bout de code est un extrait de mon script CGI qui commence déja à être un peu volumineux, donc quant à inclure toute la gestion des accés BD dedans (si j'ai bien compris ta question), c'est plutot exclus.

    Sinon y a t'il une réponse à mon problème ou est ce pas possible de faire comme cela ?
    Si ce n'est pas possible, je vois une autre facon un peu moins élégante.

  4. #4
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Solution te creer ton propre module et l'inclure dans ton script principale... Donc use tonmodule...
    MacOS 10.5 / Ubuntu / C / Python / R
    Pensez au tag résolu

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Je crois que je me suis mal expliqué

    Je recommence tout :

    Mon module est déja inclus dans mon script via un use MonModule.

    l'objet $bd est créer à partir de la "classe" présent dans ce module via un new(..)

    Mon problème est lors de l'appel dynamique d'une des fonctions (nom de la fonction renseignés dans la table de hashage) de ce module.

    L'appel ce fait comme cela :

    $bd->$function->(... mes paramètres) et ne marche pas. Apparament il n'arrive pas à interpreter "$bd->$function".

    $function vaut ici soit : \&inserer_titre_liste, \&inserer_liste,..

    Par contre j'utilise la même méthode pour des appels de fonction à l'intieur du CGI via $function->(..).

    Pour que cela soit bien clair j'inclus la partie du code concerné.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    use BDBourse;
    ...
    my $bd = new BDBourse(dsn => 'xxxx', uid => 'xxx', pwd => 'xxx');
    ....
     
    sub listes {
      my ($bd) = shift;
      my $_client = param("client") || 1;
      my $_liste = param("liste") || 0;
      my $_code = param("code") || 0;
      my $_page = param("page") || 0;
      my $_operation = param("operation") || "default";
      my @liste_clients = $bd->recuperer_listes_client($_client);
      my @liste_titres = ();
      my @tab = ();
      my $nom_liste;
     
      my %ListeOperations = (
         'ajoutertitre' => \&inserer_titre_liste,
         'ajouterliste' => \&ajouter_liste,
         'supprimertitre' => \&effacer_titre_liste,
      );
     
      if ($#liste_clients >= 0) {
     
         while(my($actualOperation,$function) = each %ListeOperations) {
     
           if ($_operation eq $actualOperation) {
     
              $bd->$function->(code => $_code, client => $_client, liste => $_liste); # ligne 280
           }
         }
    ....
    L'erreur retournée set : Undefined subroutine &main::inserer_titre_liste called at l:\xxxx\index.pl line 280

    Une idée du problème ?

  6. #6
    Membre du Club
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Points : 60
    Points
    60
    Par défaut
    Quand tu écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my %ListeOperations = ( 
         'ajoutertitre' => \&inserer_titre_liste, 
    );
    ton hash refère la fonction 'inserer_titre_liste' du package courant, par défaut c'est main, c'est-à-dire, .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListeOperations {ajoutertitre} == \&main::inserer_titre_liste
    Donc, l'appel

    est le même que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \&main::inserer_titre_liste ($bd, ...)
    Peut-être, il te faut écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my %ListeOperations = ( 
         'ajoutertitre' => \&BDBourse::inserer_titre_liste, 
    );

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Bonsoir,

    Merci pour la réponse c'est exactement ce qu'il me fallait. J'vais essayer différente chose sans penser au "::"

    Par contre petite précison pour ceux que ca intéresse, l'appel aux méthodes du module se fait maintenant par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $function->($bd,...).
    Il faut passez l'objet "$bd" comme premier argument maintenant car l'appel ne se fait plus par $bd->$function.

    A+

  8. #8
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Merci de penser au tag "résolu" en bas de la page à gauche...

    Cordialement, Choupi.
    MacOS 10.5 / Ubuntu / C / Python / R
    Pensez au tag résolu

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Bonjour Choupi,

    OK c'est noté.

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Problème de mise au point avec appel de fonctions
    Par pitou31 dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 02/05/2010, 13h01
  2. addition avec appel à une fonction
    Par TGV6975 dans le forum Débuter
    Réponses: 8
    Dernier message: 29/08/2009, 19h11
  3. [AJAX] lien généré dynamiquement avec appel de fonction javascript
    Par karimphp dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 21/11/2007, 10h23
  4. [PHP][Javascript] PB avec appel de fonctions externes, HELP!
    Par chaser_T dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/04/2006, 16h44
  5. [FLASH 8] Pb avec appel de fonction
    Par php_de_travers dans le forum Flash
    Réponses: 1
    Dernier message: 15/11/2005, 19h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo