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 :

fonction (retourner une valeur)


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Profil pro
    Ingénieur intégration
    Inscrit en
    Août 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Août 2007
    Messages : 147
    Points : 77
    Points
    77
    Par défaut fonction (retourner une valeur)
    J'essai de développer un petit menu pour la gestion de quelques tâches.
    Pour ce fait j'utilise une fonction, MAIS mon problème est le suivant :
    "Comment retourner la valeur d'une variable, ex: $choix"

    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
     
    #!/usr/bin/perl -w
    use strict;
     
    sub menu {
     print "Démarrer apache 1.\n";
     print "Stopper apache 2.\n";
     print "Quitter 100.\n";
     print "faites votre choix : ";
     my $choix = <STDIN>;
     return $choix;
    }
     
    while ($choix != 100) {
      menu();
      if ($choix = 1) { 
        fonction1();
      }else{
        if ($choix = 2) {
         fonction2();
        }
      }
    }
    Merci pour votre aide et vos idées....
    nm

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Comme ceci :
    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
    #!/usr/bin/perl
    use strict; use warnings;
     
    my %items_menu = ( 1 => ["Démarrer apache", \&start_server], 
      2 => ["Stopper apache", \&stop_server],
      100 => ["Quitter", sub { exit 0 }],
    );
     
    my $choice = 0;
    for (;;) {
      $choice = menu();
      while( not exists $items_menu{$choice} ) {
        print "Choix incorrect.\n";
        $choice = menu();
      }
      $items_menu{$choice}[1]->();
    }
     
    sub menu {
      foreach my $item (sort keys %items_menu) {
        print "$item . $items_menu{$item}[0]\n";
      }
      print "Faites votre choix : ";
      chomp (my $input = <STDIN>);
      return $input;
    }
     
    sub start_server {
      # ...
    }
     
    sub stop_server {
      # ...
    }
    Bon, j'ai un peu modifié ton code...
    Mais la partie importante est que j'affecte le résultat de menu() à la variable $choice :
    (tu remarqueras d'ailleurs qu'il n'y a plus de variable $choix dans menu(), elle n'est pas nécessaire, et cela peut entrainer une confusion comme dans ton cas).
    C'est comme ça qu'il faut faire si possible. Il y a moyen de faire fonctionner un truc qui ressemble à ton script, mais c'est hautement déconseillé : une fonction ne devrait pas avoir d'effet de bord, idéalement.

    Ton script sans les "améliorations", juste la correction nécessaire pour le faire marcher :
    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
    #!/usr/bin/perl -w
    use strict;
     
    sub menu {
     print "Démarrer apache 1.\n";
     print "Stopper apache 2.\n";
     print "Quitter 100.\n";
     print "faites votre choix : ";
     my $choix = <STDIN>;
     chomp($choix); # sinon ça ne marchera pas...
     return $choix;
    }
     
    my $choix = 0; # la variable déclarée dans menu() n'est pas la même variable
    while ($choix != 100) {
      $choix = menu();
      if ($choix == 1) { # attention, l'égalité numérique se teste avec == pas =
        fonction1();
      } elsif ($choix == 2) { # elsif est plus court que else if et évite trop d'indentation
         fonction2();
      }
    }
    --
    Jedaï

  3. #3
    Membre régulier
    Profil pro
    Ingénieur intégration
    Inscrit en
    Août 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Août 2007
    Messages : 147
    Points : 77
    Points
    77
    Par défaut
    Merci pour ta réponse... cela à tellement l'air simple comme cela!
    Cela n'est pas facile de trouver directement les bonnes réponses....

    Toutefois, j'ai quelques questions :
    1. Que signifie les point-virgule dans la boucle for :
    2. Je ne connaissais pas "exists" ? le not correspondant-il a l'expression dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while( not exists $items_menu{$choice} )
    3. Là, je patauge :
    C'est un tableau avec une valeur $choice mais qu'est-ce le dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $items_menu{$choice}[1]->();
    J'suis vraiment un débutant dans le domaine... et merci encore pour les conseils!

    nm

  4. #4
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Citation Envoyé par nymus7 Voir le message
    Merci pour ta réponse... cela à tellement l'air simple comme cela!
    Cela n'est pas facile de trouver directement les bonnes réponses....

    Toutefois, j'ai quelques questions :
    1. Que signifie les point-virgule dans la boucle for :
    C'est un idiôme pour indiquer une boucle infinie. while (1) peut également être utilisé. Question de goût.

    2. Je ne connaissais pas "exists" ? le not correspondant-il a l'expression dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while( not exists $items_menu{$choice} )
    ! et not sont synonymes, mais avec une précédence différente.

    3. Là, je patauge :
    C'est un tableau avec une valeur $choice mais qu'est-ce le dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $items_menu{$choice}[1]->();
    Jedaï a fait un "mapping" entre un entier (le choix à entrer au clavier) et un tableau (en fait, un arrayref) qui contient deux éléments: la chaîne descriptive et une référence à une fonction. Quand il dit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $items_menu{$choice}[1]->();[
    Il commence par extraire l'arrayref du hash, ensuite il sélectionne le second élément -- la référence à la fonction -- et finalement, il fait l'appel à la fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    sub dire_bonjour {
      my $nom = shift;
      print "Bonjour $nom\n";
    }
     
    dire_bonjour("Vincent"); # => Bonjour Vincent
    my $subref = \&dire_bonjour;
    $subref->("Laurent"); # => Bonjour Laurent

  5. #5
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Salut,

    Citation Envoyé par nymus7 Voir le message
    1. Que signifie les point-virgule dans la boucle for :
    Il faut savoir qu'une boucle for classique (j'entends par là comme en C) est en trois partie : initialisation, test, incrémentation. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ($i = 0 ; $i < 10 ; $i++)
    Le fait de mettre for(;; ) signifie uniquement qu'on ne fait aucune des trois partie, donc on ne fait que boucler, donc on fait une boucle infinie

    Citation Envoyé par nymus7 Voir le message
    2. Je ne connaissais pas "exists" ? le not correspondant-il a l'expression dans le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while( not exists $items_menu{$choice} )
    exists vérifie l'existence d'un élément dans un tableau ou une table de hachage... En l'occurrence, dans le code de Jedai, on cherche l'existence d'une clé ($choice) dans la table de hachage. Oui, not est synonyme de ! (en gros, en réalité ce n'est pas exactement pareil).


    Citation Envoyé par nymus7 Voir le message
    3. Là, je patauge :
    C'est un tableau avec une valeur $choice mais qu'est-ce le dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $items_menu{$choice}[1]->();
    En gros, le hachage contient des références à des sous-porgrammes, et cette écriture permet d'appeler le sous-programme référencée en ne lui passant aucun argument

    €dit : grille par Vince
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Et bien le forum est réactif, c'est vraiment un plaisir !

    Citation Envoyé par Woufeil Voir le message
    Oui, not est synonyme de ! (en gros, en réalité ce n'est pas exactement pareil).
    En fait la seule différence tient à la priorité de l'opérateur, "not" a une priorité très faible par rapport à !, ou même dans l'absolu. Comme la plupart du temps on veut dire !(tout ce + qui suit) et pas (!(tout ce)) + (qui suit), je préfère utiliser not, ainsi je peux éviter de mettre tout un tas de parenthèse inélégantes.

    De même && et || ont des variantes "and" et "or" qui ont une priorité très faible. Selon les cas l'une ou l'autre variante est plus appropriée.

    --
    Jedaï

  7. #7
    Membre régulier
    Profil pro
    Ingénieur intégration
    Inscrit en
    Août 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Août 2007
    Messages : 147
    Points : 77
    Points
    77
    Par défaut
    Merci à tous pour vos réponse rapide et clair!
    Bon, c'est vrai que les arrays, les réfs,.... ils faut du temps pour les assimiler (j'espère!!)

    Ciao
    nymus

  8. #8
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Citation Envoyé par nymus7 Voir le message
    Merci à tous pour vos réponse rapide et clair!
    Bon, c'est vrai que les arrays, les réfs,.... ils faut du temps pour les assimiler (j'espère!!)

    Ciao
    nymus
    C'est pas très sorcier. Tu as trois types de variables en Perl: scalaire, tableau et hash. Voici un petit résumé, en espérant qu'il soit assez clair.

    Scalaire: une valeur simple (penser au singulier). Exemple, un nombre ou une chaîne de caractères (une référence est aussi un scalaire, j'y reviens un peu plus tard.) On s'en servirait pour garder le nom ou l'âge d'une personne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my $nom = "Vincent";
    my $age = 24; # Snif, je suis vieux
    my $couleur_preferee = "bleu";
    Tableau: appelé "array" en anglais, c'est un conteneur. Il permet de stocker dans une même variable plusieurs valeurs. Les valeurs qu'il contient sont des scalaires. On accède aux valeurs avec un index commençant à 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my @films_preferes = ("Babar", "Les Schtroumpfs", "Aladdin");
    print $films_preferes[2]; # => Aladdin
    Hash: je suis pas sûr comment on traduirait ça en français. C'est le même principe que le tableau à l'exception qu'on peut utiliser autre chose que des entiers pour accéder aux valeurs. C'est un peu le même principe qu'un botin téléphonique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    my %telephones = (
        "cellulaire" => "790-555-1212",
        "maison" => "123-555-9090",
        "travail" => "321-555-6666",
    );
     
    print $telephone{"maison"}; # => "123-555-9090"
    Références: Comme je l'ai mentionné plus tôt, un tableau peut contenir que des scalaires. Comment avoir des arrays dans un array alors? Avec des références. Les références sont des scalaires qui "pointent" vers une autre variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my @array = (1, 2, 3);
    my $array_ref = \@array;
     
    print $array_ref->[0]; # => 1
    Il y a beaucoup plus de choses à dire sur les références et les autres types de données, mais j'espère que mes explications vont t'aider à comprendre un peu de quoi il s'agit.

  9. #9
    Membre régulier
    Profil pro
    Ingénieur intégration
    Inscrit en
    Août 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Août 2007
    Messages : 147
    Points : 77
    Points
    77
    Par défaut
    Merci beaucoup GnuVince... maintenant j'y vois plus clair.....

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

Discussions similaires

  1. un fonction qui retourne une valeur aléatoire
    Par houwa dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 02/03/2008, 20h27
  2. Réponses: 5
    Dernier message: 31/01/2008, 17h05
  3. [debutant] fonction qui retourne une valeur
    Par arnolpourri dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/06/2006, 09h29
  4. fonction retournant une valeur
    Par ryan dans le forum ASP
    Réponses: 4
    Dernier message: 06/09/2004, 17h45
  5. Retourner une valeur avec une fonction
    Par stephtbest dans le forum ASP
    Réponses: 4
    Dernier message: 31/10/2003, 16h37

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