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 :

Comportement bizarre de script avec "my"


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Points : 41
    Points
    41
    Par défaut Comportement bizarre de script avec "my"
    Salut a tous,

    :: edit :: Ou c'est moi qui code comme un pied (très très possible ca )
    J'ai un petit probleme : lorsque je déclare mes variables avec "my" dans une boucle do {} until, la boucle ne se finie jamais (meme si le code de sortie est bon) alors que si je déclare mes variables sans "my" ca marche impec

    Voila le script en question (c'est juste un bout, dans le but de tester) :

    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
    #!/usr/bin/perl -w
     
    use warnings;
    print "pour tester, ecrire fichier :\n";
    $inp_1 = <STDIN>;  chop $inp_1;
     
      if ($inp_1 eq "fichier" ) {
            do {
               print "Vous avez choisi de ripper un fichier video\n";
               print "Donnez-moi le chemin complet vers le fichier video :\n";
                  $chemin = <STDIN>; chop $chemin;
                     if ( -f $chemin && -r $chemin && -w $chemin ) {
                           print "Je vais ripper cette video : $chemin\n";
                           $dvd_1 = "";
                           $dvd_2 = "";
                           $sortie_f = "10";
                           }
                     else {
                           print "Fichier non trouvé ou non disponible en lecture/écriture !!\n";
                           print "Soyez sur que le fichier existe et qu'il est accessible en lecture/écriture\n";
                           $sortie_f = "20";
                           }
               } until ( $sortie_f eq "10" );
    }
    Et voila ce que ca donne (sans "my") :

    ./test
    Name "main::dvd_2" used only once: possible typo at ./test line 15.
    Name "main::dvd_1" used only once: possible typo at ./test line 14.
    pour tester, ecrire fichier :
    fichier
    Vous avez choisi de ripper un fichier video
    Donnez-moi le chemin complet vers le fichier video :
    /home/jerome/VTS_01_0.VOB
    Je vais ripper cette video : /home/jerome/VTS_01_0.VOB
    Et avec "my" :

    ./test
    Name "main::sortie_f" used only once: possible typo at ./test line 23.
    pour tester, ecrire fichier :
    fichier
    Vous avez choisi de ripper un fichier video
    Donnez-moi le chemin complet vers le fichier video :
    /home/jerome/VTS_01_0.VOB
    Je vais ripper cette video : /home/jerome/VTS_01_0.VOB
    Use of uninitialized value in string eq at ./test line 8, <STDIN> line 2.
    Vous avez choisi de ripper un fichier video
    Donnez-moi le chemin complet vers le fichier video :
    Alors, ou est le probleme (a part que je suis une quiche )

    Jjeje007

  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
    Les variables locales (déclarées avec my() ) ont ceci de particulier qu'elles sont ... locales ! Autrement dit elle n'existent que dans la "portée lexicale" où on les as déclarées. Une "portée" peut-être constitué d'un bloc (série d'instruction entourée d'accolades {}).
    Autrement dit, si tu déclares ta variable dans le bloc de ton do(), elle n'est pas visible par le until()....
    Si tu avais utilisé le pragma "strict" comme conseillé dans ce sujet, Perl t'aurait signalé que tu utilisais une variable non-déclarée dans ton until() et tu te serais sans doute rendu compte du problème. Mais comme tu ne l'as pas utilisé, Perl crée silencieusement une nouvelle variable globale de nom $sortie_f et lui affecte "undef" (qui est différent de 10), cette variable globale n'est jamais affecté par tes opérations sur $sortie_f dans le bloc du do() parce qu'elle y est masquée par la variable locale (c'est l'un des avantages des variables locales : tu n'as pas besoin de te préoccuper de si tu utilises ailleurs une autre variable du même nom car ta variable locale n'influera jamais l'extérieur de sa portée et ne sera jamais influencée par lui).

    Autrement dit : utilise le pragma "strict", et déclare my($sortie_f) avant le do().

    (Par ailleurs essaie d'utiliser chomp() plutôt que chop(), ça t'évitera de te trouver un jour à massacrer une valeur en faisant deux chop() dessus sans t'en apercevoir (et je peux te dire que lorsque tes programmes se complexifieront, tu seras bien content de ne pas avoir ce soucis) )

    --
    Jedaï

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Points : 41
    Points
    41
    Par défaut
    Ok merci pour ces renseignements précieux !

    Jjeje007

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

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