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 :

sub perl qui permet de faire n tentatives d'execution d'un bout de code


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 158
    Par défaut sub perl qui permet de faire n tentatives d'execution d'un bout de code
    Bonjour,

    J'essaye de construire une sub en perl, qui permet de faire n tentatives d'execution d'un bout de code perl qu'on lui passerait en paramètre.
    J'ai pour l'instant fait ceci qui récupère et affiche 3 fois le code retour d'une commande perl passée en paramètre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sub tentative_execution{
        my ($func)  = @_;
        for (0 .. 3) {
     
                     my $code_retour = eval($func);
                     print $code_retour;
     
        }
     
    }
    Premier problème, ca ne fonctionne que si je lui passe en paramètre une sub déclarée au préalable, et non une commande perl directement (par exemple print "toto") .
    Est ce que c'est possible de faire une telle fonction en lui passant en paramètre du code perl?
    par exemple je voudrais réussir à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tentative_execution( print "toto" );
    qui ferait n tentatives d'execition de la commande print "toto".

    Merci pour votre éclairage.

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Par défaut
    Qu'est ce que tu appelles ne pas marcher? Qu'est ce que tu obtiens et que tu veux pas?

    Petite remarque, te renverra 4 fois le résultat

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Il faut passer à la procédure tentative_execution une référence vers ta fonction (une "code ref").

    Exemple rapide sous le debugger Perl:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      DB<1>  $f = sub {print "toto";};
     
      DB<2>  sub tentative {$g = shift; $g->();}
     
      DB<3> tentative($f);
    toto
      DB<4>
    - $f est une référence vers la fonction anonyme " sub {print "toto"}"
    - tentative est une fonction normale recevant en paramètre une code ref et l'exécutant
    - la troisième ligne exécute tentative, qui lance la fonction anonyme, ce qui affiche toto.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 158
    Par défaut
    supression message

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 158
    Par défaut
    Bonjour,


    J'en suis arrivé au code ci dessous, pour faire 3 tentatives d'execution de la fonction $f.

    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
    $f = sub {print "toto";};
     
     
    sub tentative 
    {
    $g = shift; 
    $nb_tentatives = 3;
     
    do {
     
    my $code_retour = eval ($g->());
     
    print $code_retour;
     
    $nb_tentatives--;
     
    } while (($nb_tentatives >= 1 ) && ($code_retour == 0));
     
    }
     
    tentative($f);

    Je ne saisis pas quelquechose...
    Ce code m'affiche "toto1toto1toto1"
    Donc le code retour est visiblement 1. Pourtant la boucle est parcourue 3 fois comme si le code retour était 0 (ce qui me parait logique puisque le print toto a bien abouti...)
    Pourquoi est ce que j'ai le code retour 1 affiché à l'écran?

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    C'est à toi de faire un return dans ton sub, sinon, il renvoie 1.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 158
    Par défaut
    Citation Envoyé par leon1983 Voir le message
    Bonjour,


    J'en suis arrivé au code ci dessous, pour faire 3 tentatives d'execution de la fonction $f.

    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
    $f = sub {print "toto";};
     
     
    sub tentative 
    {
    $g = shift; 
    $nb_tentatives = 3;
     
    do {
     
    my $code_retour = eval ($g->());
     
    print $code_retour;
     
    $nb_tentatives--;
     
    } while (($nb_tentatives >= 1 ) && ($code_retour == 0));
     
    }
     
    tentative($f);

    Je ne saisis pas quelquechose...
    Ce code m'affiche "toto1toto1toto1"
    Donc le code retour est visiblement 1. Pourtant la boucle est parcourue 3 fois comme si le code retour était 0 (ce qui me parait logique puisque le print toto a bien abouti...)
    Pourquoi est ce que j'ai le code retour 1 affiché à l'écran?
    je ne comprends pas pourquoi le condition $code_retour == 0 est remplie (la boucle se poursuit bien) alors que lorsque je print le $code_retour ca affiche 1


  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Il faut passer à la procédure tentative_execution une référence vers ta fonction (une "code ref").

    Exemple rapide sous le debugger Perl:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      DB<1>  $f = sub {print "toto";};
     
      DB<2>  sub tentative {$g = shift; $g->();}
     
      DB<3> tentative($f);
    toto
      DB<4>
    - $f est une référence vers la fonction anonyme " sub {print "toto"}"
    - tentative est une fonction normale recevant en paramètre une code ref et l'exécutant
    - la troisième ligne exécute tentative, qui lance la fonction anonyme, ce qui affiche toto.
    Il est possible de ne pas définir de fonction anonyme en utilisant les prototypes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub tentative_execution(&) {
      my ($func)  = @_;
      for (0 .. 3) {
        my $code_retour = $func->();
        print $code_retour;
      }
    }
    tentative_execution { print "toto" };
    On aussi écrire tentative_execution(sub { print "toto" }), mais plus tentative_execution($f) si $f = sub { print "toto" } (ce qui peut paraitre étrange).

  9. #9
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Mon utilisation d'une fonction anonyme était juste un exemple. On peut aussi bien utiliser une référence vers une fonction nommée, sans avoir besoin de prototype. Exemple sous le debugger Perl:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      DB<1>  sub  my_print {print "toto \n"};
      DB<2>  sub execute {$g = shift; $g->();};
      DB<3> execute (\&my_print)
    toto
      DB<4> $f = \&my_print
      DB<5> execute ($f)
    toto
      DB<6>

  10. #10
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Je voulais juste relever que l'on pouvait, à l'aide des prototypes, s'approcher de l'écriture initiale de léon en proposant en paramètre un "bloc de code" et non une référence à une fonction anonyme (closure), un peu à la manière de la fonction grep (qui n'accepte pas non plus de closure, mais bien un bloc de code). Dans ce contexte, seul le prototypage permet d'accepter un bloc de code en paramètre, alors que l'usage des closures ou des références à des fonctions ne nécessite effectivement pas de prototype (par défaut, il s'agit d'un paramètre scalaire que l'on déréférence comme une fonction).

Discussions similaires

  1. Module qui permet de faire des régression linéaire ?
    Par Anti-T dans le forum Calcul scientifique
    Réponses: 3
    Dernier message: 04/09/2009, 13h28
  2. Réponses: 4
    Dernier message: 22/02/2008, 15h34
  3. [Icon] Librairie qui permet de faire des interfaces graphiques
    Par kespy13 dans le forum Autres langages
    Réponses: 1
    Dernier message: 25/10/2007, 18h25
  4. c Quoi la requette qui permet de faire ca?
    Par issam16 dans le forum Access
    Réponses: 1
    Dernier message: 21/06/2006, 15h00
  5. cherche une fonction qui permet de faire une recherche
    Par vbcasimir dans le forum Langage
    Réponses: 7
    Dernier message: 01/09/2005, 17h24

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