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] probleme sur test d'une variable


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut [langage] probleme sur test d'une variable
    salut,

    JE souhaiterais faire une boucle pour tester si une variable est vide, c'est à dire tant que la variable n'est pas renseigner alors je ne continu pas mon code
    mais j'ai un soucis ,quand je le lance et que je ne saisi aucune variable(donc je tape entrée),il ne me reaffiche pas le message me demandant de saisir la variable;
    et quand je vais voir mon fichier j'ai cela
    OS=

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #!/usr/bin/perl -w
     
    use strict;
     
    open FILE, ">./fic1.cfg";
    print "Saisir variable OS\n";
    my $OS=<stdin>;
    unless ($OS)
    {
    print "Saisir variable OS\n";
    my $OS=<stdin>;
    }
    print FILE "OS=$OS\n";
    PS : j'ai fait une recherche sur le forum,
    je me suis inspiré de cela http://www.developpez.net/forums/sho...highlight=vide
    car j'ai tester avec not defined, == "" et eq "" et sa ne fonctionnait pas:


    merci

  2. #2
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    j'ai essayer de rajouter
    chomp($OS)
    le prompt s'affiche une fois
    je tape entrer, il se reaffiche une 2eme fois et je tape entré,ensuite il ne se reaffiche(il sort de la boucle)

  3. #3
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Il y a plein d'erreurs et d'approximations.

    Si tu veux faire une boucle, il faut utiliser une structure de controle de boucle. "unless" ne suffit pas. Ce n'est qu'un "if".

    Avec le unless, tu te donnes une seconde chance de saisir une valeur valide, mais c'est tout car il n'y a aucun controle à suivre.

    Peut-être voulais-tu utiliser "until" ?

    Ensuite, redéfinir localement ta variable $OS dans le bloc ne va pas aider. Sitôt sorti du bloc, c'est première valeur attribuée à $OS qui sera prise en compte.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  4. #4
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    1. Une variable ne peut pas commencer par un chiffre...
    2. le unless n'est pas une boucle, c'est un if inversé (unless signifie "à moins que")... tu confonds avec until
    3. toujours tester que l'ouverture du fichier a réussi avant d'écrire dedans..
    4. toujours fermer les fichiers ouverts


    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
     
    #!/usr/bin/perl -w
     
    use strict;
     
    my $OS;
    do {
        print "Saisir variable OS : \n";
        $OS = <stdin>;
        chomp($OS);
    } while (! ($OS));
     
    my $filename = './fic1.cfg';
    open(FILE, '>', $filename) || die("impossible d'ouvrir $filename en écriture");
    print FILE "OS=$OS\n";
    close(FILE);

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  5. #5
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    ouai voila c'est ce que je souhaitais faire
    au depart j'avais essayer avec un while
    et je pije pas pourquoi sa fonctionne pas pourtant c'est le meme raisonnement
    tant que ma variable ne contient rien alors tu boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    use strict;
    my $OS;
    print " valeur de OS\n";
    $OS=<stdin>;
    while (!($OS))
    {
    print "  valeur de  OS\n";
    $OS=<stdin>;
    chomp($OS);
    }

  6. #6
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par Melvine
    ...
    et je pije pas pourquoi sa fonctionne pas pourtant c'est le meme raisonnement...
    Ce n'est pas le même raisonnement et l'algorithme utilisé par MarneusCalgarXP est beaucoup plus sûr en fonctionnement et en maintenance (il ne s'agit même pas de Perl, sur ce point).

    En effet, pour une lecture d'E/S, il est plus fiable de lire à l'intérieur d'une boucle, avec une condition de sortie de cette boucle, plutôt que de lire avant la boucle pour initialiser, d'avoir une condition de maintien dans la boucle et une autre lecture à l'intérieur. De plus, le jour ou l'on décide de changer la source de la lecture, il est plus sûr de ne changer qu'une instruction plutôt que l'initialisation d'une part et la lecture dans la boucle d'autre part.

    Cette structure algorithmique est donc généralement à privilégier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    do {
        # lecture
        # autres traitements ...
    } while (condition);
    Cela permet de construire la condition pour attendre une valeur précise, ou bien pour traiter les fins de fichier, etc. en s'assurant qu'une tentative de lecture, au moins, aura été faite.

    En plus, c'est plus simple.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  7. #7
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    la difference entre son while et le mien je la connai
    j'ai fait de l 'algorithmie
    mais en theorie ma solution aurai du marché aussi
    vu que je teste avant de rentré dans la boucle
    donc si $OS est vide je rentre dans la boucle et tant que $OS est vide je tourne...

    j'ai mis le code dans une fonction , c'est plus simple vu que je vias l'appeler plusieurs (je partage pour ceux qui en auront besoin)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub checking
    {
    do {
        print "Saisir variable $_[0]: \n";
        $_[0] = <stdin>;
        chomp($_[0]);
    } while (! ($_[0]));
    	}

  8. #8
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par Melvine
    la difference entre son while et le mien je la connai
    j'ai fait de l 'algorithmie
    mais en theorie ma solution aurai du marché aussi
    vu que je teste avant de rentré dans la boucle
    donc si $OS est vide je rentre dans la boucle et tant que $OS est vide je tourne...
    Si tu as fait de l'algorithmie, tu sais aussi que dupliquer la duplication de code est une possible source d'erreur.

    Avec ta lecture préalable, il faut dupliquer TOUS les traitements qui vont avec :
    • le print d'invite
    • ET SURTOUT le chomp avant ton test d'entrée dans la boucle


    L'algorithme de MarneusCalgarXP est plus fiable de ce point de vue. C'est ce que j'ai tenté d'expliquer, et que ton erreur démontre.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  9. #9
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    exact je suis tout a fait d'accord avec toi

  10. #10
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    N'oublie pas :

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  11. #11
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    je souhaite faire un autre test en faite
    si aucune valeur n'est saisi dans le prompt alors je recupere l'ancienne valeur que j'ai mise dans une variable;
    Le truc si je lui met une valeur dans le prompt il recupere cette valeur
    par contre si je ne met aucune valeur ,alors il ne recupere pas la valeur que j'ai stocké dans ma variable

    voila mon script
    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
    if ($valid ne "o")
    {
     
     
    do {
        print $_[1]."[".$_[0]."]";
        $_[0] = <stdin>;
        print "\n"; 	
        chomp($_[0]);
     
       } while (! ($_[0]));
     
    }
    else
    {
    print $_[1]."[".$_[0]."]";
     
       $_[0] = <stdin>;
     
       if (! ($_[0]))
    	{ 
    	$_[0] = $old; 
    	} 
        print "\n";
     
        chomp($_[0]);
     
    }
    pourtant je test bien si la personne saisi ou non une valeur avec cela
    (! ($_[0]))
    je comprend pas ???

  12. #12
    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
    Bonjour,

    Ton problème est que tu oublies de faire un chomp avant de tester la variable, donc elle contient \n, donc elle n'est pas vide
    "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.

Discussions similaires

  1. [Débutant] Probleme d'incrémentation d'une variable
    Par sakuragikan dans le forum ASP
    Réponses: 2
    Dernier message: 25/08/2005, 13h11
  2. [Debutant] Probleme d'acces a une variable
    Par Bugmaster dans le forum Langage
    Réponses: 16
    Dernier message: 02/09/2004, 15h57
  3. Réponses: 13
    Dernier message: 14/06/2003, 22h15
  4. Réponses: 3
    Dernier message: 07/04/2003, 20h06
  5. [langage] Extraire un block dans une variable multiligne
    Par |DUCATI| DesMo dans le forum Langage
    Réponses: 9
    Dernier message: 11/02/2003, 14h56

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