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

Web Perl Discussion :

appel de fonction via une variable


Sujet :

Web Perl

  1. #1
    Futur Membre du Club
    appel de fonction via une variable
    Bonjour,

    je m'explique,
    j'utilise le perl avec cgi, donc jai une page index et une page fonction

    page index.cgi
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my $CIBLE = $FORM->param('cible');
    if (!$CIBLE){
    	view_sommaire();
    }
    else{
    	view_$CIBLE();
    }


    Page fonction.cgi
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    sub view_sommaire {
    	print "<h2>Sommaire</h2>";
    	print "<a href=index.cgi?cible=shearchVisio>Mise en Relation</a><br>";
    }
     
    sub view_shearchVisio {
    	print "<h2>Mise en Relation - Recherche Visio</h2><hr>";
    	print "<form action='index.cgi?cible=ListVisio' method='post'>";
    	print "Nom de la visio: <input name='visio' type='text'> ";
    	print "<input name='submit' value='Rechercher' type='submit'>";
    	print "</form>";	
    }


    le problème est quand je clique sur le lien "Mise en Relation", la variable $CIBLE recupère bien "shearchVisio"
    mais quand j'appel la fonction view_shearchVisio de cette façon view_$CIBLE cela me retourne une erreur.

    Y'a t-il une maniére de faire pour inclure une variable dans un nom de fonction comme je désire le faire ?

  2. #2
    Rédacteur/Modérateur

    Hum, à supposer que j'aie compris ce que tu veux faire, je pense qu'il est préférable de faire un tableau ou un hash de références vers des fonctions.

  3. #3
    Futur Membre du Club
    J'ai modifié un peu mon code mais ça me fait toujours pareil..

    En gros ce que je cherche à faire, c'est appeler ma fonction de cette façon :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    MiseRel::view$CIBLE();

    au lieu de faire comme ceci
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    MiseRel::viewShearchVisio();


    Et donc quand je fais view$CIBLE, en erreur il me dit qu'il connait pas la fonction view donc c'est qu'il ne lit pas le contenu de ma variable dans le nom de la fonction.

    Comment faire ??

  4. #4
    Futur Membre du Club
    J'ai trouvé une petite alternative,

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    my $CIBLE;
    $CIBLE=$POST->param('cible');
    if (!$CIBLE){ 
    	MiseRel::viewSommaire();
    }
    else{
    	MiseRel::viewShearchVisio() if ($CIBLE=='ShearchVisio');
                  # le mieux serait MiseRel::view$CIBLE();
    }


    Mais bon ça fait une ligne if pour chaque paramètre différent, c'est pas le but.

  5. #5
    Rédacteur/Modérateur

    Je te redis que la bonne solution est sans doute un hash de références sur des fonctions, ce que l'on appelle assez souvent dispatch table ou table de distribution. Il n'y a pas à avoir peur de ces grands mots, c'est assez simple.

    Voici un exemple:

    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
    use strict;
    use warnings;
     
    my %dispatch = ( sommaire => \&view_sommaire ,
                           searchVisio => \&view_searchVisio);
     
     
    for my $cible (qw /sommaire searchVisio/) {
    	$dispatch{$cible}->(); # appelle successivement view_sommaire et view_searchVisio
    }
     
    sub view_sommaire {
    	print "<h2>Sommaire</h2>";
    	print "<a href=index.cgi?cible=shearchVisio>Mise en Relation</a><br>";
    }
     
    sub view_searchVisio {
    	print "<h2>Mise en Relation - Recherche Visio</h2><hr>";
    	print "<form action='index.cgi?cible=ListVisio' method='post'>";
    	print "Nom de la visio: <input name='visio' type='text'> ";
    	print "<input name='submit' value='Rechercher' type='submit'>";
    	print "</form>";	
    }


    La table de distribution c'est ceci:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    my %dispatch = ( sommaire => \&view_sommaire ,
                           searchVisio => \&view_searchVisio);

    Cela dit en fait que si j'ai le mot clef sommaire, je dois appeler la fonction view_sommaire, etc. Tu ajoutes simplement une nouvelle ligne du même type pour chaque cible et chaque fonction.

    La partie ci-dessous:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    for my $cible (qw /sommaire searchVisio/) {
    	$dispatch{$cible}->(); # appelle successivement view_sommaire et view_searchVisio
    }

    est juste mon test du bon fonctionnement. $dispatch{$cible}->() appelle la fonction référée par $cible dans la table de distribution.

    Cela m'a bien imprimé successivement le contenu des fonctions view_sommaire et view_searchVisio.

  6. #6
    Futur Membre du Club
    Super !

    Merci beaucoup, ça marche tout seul

    Je ne connaissais pas cette méthode ! (Débutant en Perl )