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 :

Question débutant while, if/else


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 23
    Points : 6
    Points
    6
    Par défaut Question débutant while, if/else
    Bonjour, j'ai fait un code inspiré d'un tuto perl d'un site (dont tous les membres sont en vacances, en tout cas les perlistes) qui ne me renvoie pas d'erreur mais ne fait pas ce que je voulais. voilà le code qui est assez claire je crois :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    use strict;
    use warnings;
     
    print "Choisissez un animal dans la liste. \
    L'ordinateur le retrouvera grace aux reponses que \
    vous ferez aux questions qu'il vous posera.\n";
    print "Vous repondez par oui ou par non.\n\n";
     
    my $continuer="";
    print "lion, elephant, girafe, gazelle\n\n";
     
    while ($continuer ne "n")
     
    {
    	print "L'animal est-il carnivore ? \n";
    	my $Reponse=<>;
    	chomp $Reponse;
    	if ($Reponse eq 'oui')
     
    	{
    		print "C'est un lion.\n";
    		print "voulez-vous continuer (o/n) ? \n";
    		my $continuer=<>;
    		chomp $continuer;
    	}
    	else
    	{
    		print "L'animal a-t-il un long cou ? \n";
    		my $Reponse=<>;
    		chomp $Reponse;
    	}
    		if ($Reponse eq 'oui')
     
    		{
    			print "c'est une girafe\n";
    			print "voulez-vous continuer (o/n) ? \n";
    			my $continuer=<>;
    			chomp $continuer;
    		}
    		else
    		{
    			print "L'animal a-t-il des defenses ? \n";
    			my $Reponse=<>;
    			chomp $Reponse;
    		}
    			if ($Reponse eq 'oui')
     
    			{
    				print "C'est un elephant.\n";
    				print "voulez-vous continuer (o/n) ? \n";
    				my $continuer=<>;
    				chomp $continuer;
    			}
    			else
    			{
    				print "C'est une gazelle.\n";
    				print "voulez-vous continuer (o/n) ? \n";
    				my $continuer=<>;
    				chomp $continuer;
    			}
    }
     
    <>;
    Le soucis c'est que quand je réponds 'non' ou 'oui' d'ailleurs à la question "voulez-vous continuer" le programme continue se s'exécuter ou également en répondant 'oui' à la question "L'animal a-t-il des défenses ?" le prog répond "C'est une gazelle".



    Si quelqu'un peut m'éclairer ?

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 23
    Points : 6
    Points
    6
    Par défaut

  3. #3
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Voici le code un peu amélioré :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #!/usr/bin/perl
    use warnings;
    use strict;
     
    my $message = <<'MESSAGE';
    Choisissez un animal dans la liste.
    L'ordinateur le retrouvera grace aux reponses que
    vous ferez aux questions qu'il vous posera
     
    Vous repondez par oui ou par non.
     
    lion, elephant, girafe, gazelle
    MESSAGE
     
    my $continuer = 'o';
    while ( lc $continuer ne 'n' ) {
    	print "L'animal est-il carnivore ? \n";
    	my $Reponse = <STDIN>;
    	chomp $Reponse;
    	if ( lc $Reponse eq 'o' ) {
    		print "C'est un lion.\n";
    		print "voulez-vous continuer (o/n) ? \n";
    		$continuer = <STDIN>;
    		chomp $continuer;
    		next;
    	}
    	else {
    		print "L'animal a-t-il un long cou ? \n";
    		$Reponse = <STDIN>;
    		chomp $Reponse;
    	}
     
    	if ( lc $Reponse eq 'o' ) {
    		print "c'est une girafe\n";
    		print "voulez-vous continuer (o/n) ? \n";
    		$continuer = <STDIN>;
    		chomp $continuer;
    		next;
    	}
    	else {
    		print "L'animal a-t-il des defenses ? \n";
    		$Reponse = <STDIN>;
    		chomp $Reponse;
    	}
     
    	if ( lc $Reponse eq 'o' ) {
    		print "C'est un elephant.\n";
    		print "voulez-vous continuer (o/n) ? \n";
    		$continuer = <STDIN>;
    		chomp $continuer;
    		next;
    	}
    	else {
    		print "C'est une gazelle.\n";
    		print "voulez-vous continuer (o/n) ? \n";
    		$continuer = <STDIN>;
    		chomp $continuer;
    		next;
    	}
    }
    Ton code déclare des variables n'importe où et surtout n'importe comment ce qui pose des soucis au niveau de leurs portabilités.
    Tu sais maintenant sur quel site avoir des bonnes informations !

  4. #4
    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
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    ce programme est vraiment très mal écrit et le fait que quelqu'un propose cela comme programme d'exemple dans un tutoriel est une calamité. Cela prouve que l'auteur: 1. ne connaît pas vraiment (ou ne connaît vraiment pas ?) Perl; 2. ne sait pas réellement développer un programme, indépendamment du langage; 3. n'a même pas testé son programme.

    A titre d'information, le problème précis que tu rencontres est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		else
    		{
    			print "L'animal a-t-il des defenses ? \n";
    			my $Reponse=<>;
    			chomp $Reponse;
    		}
    			if ($Reponse eq 'oui')
    Dans ce bloc else, si tu réponds oui, la variable $Réponse reçoit bien le "oui", enlève le retour à la ligne, et... disparaît, puisqu'elle est définie dans ce bloc. Quand tu sors du bloc et teste la réponse de la dernière ligne de code ci-dessus, la variable $Reponse ne contient plus ce que tu as répondu à la question sur les défenses, mais la réponse à la question précédente (le long cou), donc un non. Ce qui t'amène à la réponse gazelle.

    Donc, le problème précis est ce que je viens de dire, mais l'ensemble du programme souffre d'une conception très défectueuse.

    OK, c'est une erreur de débutant (ou, soyons magnanime, de quasi-débutant, la portée lexicale des variables est un sujet que l'on aborde pas tout de suite après le 'print "hello world \n";', il y a quelques petits trucs à voir entre les deux), on ne peut pas en vouloir à un débutant ou un quasi-débutant de la faire. Mais trouver ce genre d'erreurs (et plus généralement ce code très pauvre) dans un tuto, là, j'hallucine. Et se permettre d'écrire un tuto quand on maîtrise aussi peu et aussi mal, ce n'est plus de l'audace, pas même de la témérité, mais carrément de l'inconscience. C'est un peu comme si un élève de collège en cinquième voulait écrire un manuel d'anglais à destination de ceux de sixième. Certes, il en sait peut-être un peu plus que son public, tout n'est pas faux, mais il risque d'enseigner pas mal de bêtises. Surtout, n'essaie pas d'apprendre le Perl avec ce tuto.

    Si tu cherches un bon tuto en français, je te conseille les tutos que l'on peut trouver ce site. Je pense en particulier à celui de Sylvain Lhuillier, qui est très bien fait, mais il y en a sans doute d'autres.

    EDIT: je barre mes commentaires à propos du tutoriel. J'avais compris que ce programme était proposé comme exemple par le site en question, ce n'est manifestement pas le cas.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Merci pour vos réponses. je tiens à préciser que le code que j'ai posté est "inspiré" d'un des TP d'un tuto d'un autre site. J'ai simplement lu l'énoncé et essayé de le faire à ma sauce...La correction ne ressemble en rien à ce que j'ai fait. J'ai appris les bases de python il y a quelques temps seulement et j'ai essayé de transposer ce que je sais faire en python avec ce que j'ai appris de perl. Manifestement pas concluant...Je crois que je suis bon pour suivre un tuto plus sérieusement.
    Simplement Lolo78, tu dis que le problème se trouve dans le portée lexicale des variables, pourtant dans le code que djibril a posté elles se trouvent également dans des blocs différents, de même dans l'exemple dont tu parles pourquoi la variable contient la réponse à la question du long cou qui se trouve également dans un autre bloc ? Egalement les 'if' et 'else' du code djibril sont tous sur le même plan (alors que dans le code python que j'ai fait il fallait les indenter). Les accolades suffisent en perl ?

  6. #6
    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
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Dans le code de Djibril, le "my $Reponse" se trouve juste après le while, si bien que la portée lexicale de la variable est la boucle while, et cela fait toute la différence: il n'y a bien qu'une seule variable $Reponse dans tout le bloc while. Ce qui pose problème dans le bout de code que j'ai extrait, c'est le fait que le "my $Reponse" soit dans le bloc else, si bien que la portée lexicale de $Reponse est le seul bloc else. En-dehors de ce bloc else, $Reponse est un autre variable lexicale déclarée plus haut.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Ok je vois, je déclarais une nouvelle variable à chaque fois...
    Je te remercie, je te remercie je crois que j'ai du boulot.

  8. #8
    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
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Flo963 Voir le message
    Egalement les 'if' et 'else' du code djibril sont tous sur le même plan (alors que dans le code python que j'ai fait il fallait les indenter). Les accolades suffisent en perl ?
    Oui, ce sont les accolades qui définissent la structure des blocs, et non l'indentation comme en Python. En fait, l'utilisation de l'indentation pour définir les structures de contrôle est une caractéristique très particulière de Python, il y a très peu de langages de programmation faisant cela. Dans la plupart des autres langages, y compris Perl, l'indentation n'a aucune espèce d'impact sur le fonctionnement du programme, elle ne sert qu'à bien visualiser les blocs de code.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Ah ok, c'est une déformation du fait d'avoir commencer par python... Et si je ne me trompe pas la fonction du 'next' est de renvoyer au début de la boucle alors ?

  10. #10
    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
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Flo963 Voir le message
    Ah ok, c'est une déformation du fait d'avoir commencer par python...
    Exactement.

    Perso, quand j'ai fait du Python (qui a été mon langage de prédilection pendant environ 2 ou 3 ans, avant que je ne découvre Perl), j'avais trouvé l'idée de faire cela très intéressante, même si cela amène quelques contraintes.

    Citation Envoyé par Flo963 Voir le message
    Et si je ne me trompe pas la fonction du 'next' est de renvoyer au début de la boucle alors ?
    Oui, ça saute directement au pas suivant de la boucle.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    J'ai commencé le Perl parce que je suis intéressé par le traitement lexical (et la première chose que l'on entend à propos de Perl c'est qu'il est bon pour ça), en quelques mots quels sont les avantages que tu as trouvés à Perl ?

  12. #12
    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
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    L'intégration des expressions régulières au coeur du langage, la rapidité, la simplicité, l'expressivité (pouvoir faire beaucoup de choses en quelques lignes de code), l'aspect "do what I mean" du compilateur, la richesse de la bibliothèques des modules externes (CPAN), etc.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Ok merci.

Discussions similaires

  1. Question boucle while/else
    Par Stoos dans le forum Général Python
    Réponses: 3
    Dernier message: 08/05/2012, 20h36
  2. [Débutant] while et if
    Par SAKDOSS dans le forum C
    Réponses: 6
    Dernier message: 26/10/2005, 14h36
  3. Question débutant ...
    Par Lypertrophie dans le forum Débuter
    Réponses: 4
    Dernier message: 25/10/2005, 19h00
  4. [Débutant] if...then...else
    Par jive dans le forum ASP
    Réponses: 5
    Dernier message: 16/09/2005, 14h11
  5. Réponses: 3
    Dernier message: 26/05/2004, 23h03

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