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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    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 éclairé
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    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 : 55
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    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.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    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);

  5. #5
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    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 : 55
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    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.

  7. #7
    Membre éclairé
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    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]));
    	}

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