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 :

appel de procédure


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    Par défaut appel de procédure
    Lorsque je fais ce code, je me retrouve avec ma variable Login à vide, alors que je devrai avoir le login XP. puisque si type = essai1 , alors je lance attribution.

    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
     
    my $Login = "";
     
    sub TOTO ()
    {
      print "$Login\n";
    }
     
    sub ATTribution ()
    {
      my $Login = "XP";
    }
     
    if ("${Type}" eq "essai1") { ATTribution; }
     
    TOTO;
    merci de votre aide

  2. #2
    Membre habitué Avatar de rcageot
    Profil pro
    rien
    Inscrit en
    Septembre 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Septembre 2006
    Messages : 128
    Points : 170
    Points
    170
    Par défaut
    si tu ne passes pas ta variable à ta sub il ne risque pas de la connaitre
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    sub test {
     local( $var) = @_;
     $var = uc($var);
     return($var);
    }
    $login=test("texte de ma variable") ;
    print $login;

  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
    Citation Envoyé par rcageot
    si tu ne passes pas ta variable à ta sub il ne risque pas de la connaitre
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    sub test {
     local( $var) = @_;
     $var = uc($var);
     return($var);
    }
     
    print test("texte de ma variable") ;
    $var vaut 1, dans ce contexte, et pas la chaine passée en paramètre.
    Je rappelle que @_ est la liste de tous les paramètres de la fonction. Son affectation dans un scalaire donne donc le nombre de paramètres.

    Sinon, dans l'usage qu'il en fait, vince2005 n'a pas besoin de passer sa variable en paramètre puis qu'elle est globale (déclarée avant et hors de toute fonction). La pertinence de l'usage de variables globales est un autre débat.

    Son erreur porte sur la fonction ATTribution. En effet, il y a déclaré $Login comme étant locale (avec le my). La valeur attribuée dans la fonction est donc perdue aussitôt son exécution terminée.

    Vince2005, je te recommande de reprendre un peu de lecture, notamment de la FAQ où l'on parle de la portée et de la visibilité des variables, ainsi que des appels de fonction.

    Par ailleurs, pourquoi fais tu toujours un test ("${Type}" eq "chaine"), là où un ($Type eq "chaine") suffit ?
    Perl n'est pas bash. Il n'y a pas nécessairement besoin d'encadrer la variable par des "" et le ${ } me paraît superflu. Non ?

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Citation Envoyé par vince2005
    Lorsque je fais ce code, je me retrouve avec ma variable Login à vide, alors que je devrai avoir le login XP. puisque si type = essai1 , alors je lance attribution.

    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
    my $Login = "";
    
    sub TOTO ()
    {
      print "$Login\n";
    }
    
    sub ATTribution ()
    {
      my $Login = "XP";
    }
    
    if ("${Type}" eq "essai1") { ATTribution; }
    
    TOTO;
    merci de votre aide
    C'est normal, tu as déclaré une variable local $Login dans la sub avec ton my... du coup, la variable globale n'est pas modifiée. Retire le my, ca ira mieux !

  5. #5
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    Par défaut
    en fait si en début de script, j'écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my $Login = "TEST_LOGIN";
    et bien dans ma procédure, je me retrouverai avec ce résulat TEST_LOGIN, meme si encours de route, j'attribue un nouveau libéllé à $Login.

    si je déclare simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    $Login = "TEST_LOGIN";
    j'ai le meme probléme !!!

  6. #6
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    Par défaut
    merci ça semble fonctionner en retirant le my !!!

  7. #7
    Membre habitué Avatar de rcageot
    Profil pro
    rien
    Inscrit en
    Septembre 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Septembre 2006
    Messages : 128
    Points : 170
    Points
    170
    Par défaut
    Citation Envoyé par 2Eurocents
    $var vaut 1, dans ce contexte, et pas la chaine passée en paramètre.
    Je rappelle que @_ est la liste de tous les paramètres de la fonction. Son affectation dans un scalaire donne donc le nombre de paramètres.
    je fais peut être une erreur depuis la nuit des temps mais j'ai toujours fais comme ça et ça marche! $var n'est pas égal à 1! mais contient bien la chaine de caractères passé en paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sub test {
       local($var) = @_;
    me renvoit bien le premier paramètre passé à la sub (même si 2 ou plus sont envoyés)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       local ($var1,$var2) = @_;
    m'assigne bien le premier et le 2ème paramètre passé à la sub !!

    j'utilise aussi de temps en temps quand j'ai le temps
    voir par exemple ce qu'en dit la doc sur les perlsub http://www.bribes.org/perl/docfr/perlsub.html:

  8. #8
    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
    Vous avez tous les deux raisons !

    Je m'explique, si l'on affecte, dans un contexte scalaire, @_ à un scalaire, alors il vaudra bien le nombre d'élements de @_. Mais si l'on effecte dans un contexte de liste (donc en mettant des paranthèses) @_ à un scalaire, le scalaire vaudra le premier élément de la liste

    En fait, c'est même plus compliqué. un listing explicitera mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my @tab = ("ele1","ele2","ele3");
    my $toto = @tab; #toto vaudra 3
    my ($titi) = @tab; #titi vaudra "ele1"
    my $foo = ("ele1","ele2","ele3"); #foo vaudra "ele3". Perl renvoie un warning si le pragma du même nom est activé
    C'est particulier, je vous l'accorde
    Pour le dernier cas, la régle veux qu'une évaluation en contexte scalaire d'une liste (pas d'un tableau, d'une liste, c'est différent !) renvoie le dernier élément de la liste.

  9. #9
    Membre habitué Avatar de rcageot
    Profil pro
    rien
    Inscrit en
    Septembre 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Septembre 2006
    Messages : 128
    Points : 170
    Points
    170
    Par défaut
    n'empêche que j'aurai du parier avec 2Eurocents
    dans mon exemple j'aurai gagné

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Citation Envoyé par vince2005
    merci ça semble fonctionner en retirant le my !!!
    ok, n'oublie pas

  11. #11
    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 rcageot
    n'empêche que j'aurai du parier avec 2Eurocents
    dans mon exemple j'aurai gagné
    Moi, je tourne chèvre ... j'avais copié/collé ton code dans mon shell pour vérifier ce que je pensais, avant de répondre en citant ...

    Dans l'historique de mon shell, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      372  perl -e 'sub test {
      373   my $var = @_;
      374   $var = uc($var);
      375   return($var);
      376  }
      377  print test("texte de ma variable") ;'
    Ce qui est faux.

    Dans ton message, et ma citation, je vois apparaître :Ce qui est juste ...

    Je crois que je vais aller prendre mes petites pilulles bleues, avant de douter davantage de la réalité qui m'entoure.

  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
    J'ai aucun mal à te croire, j'avais du mal à admettre que tu ne saches pas ça 2Eurocents

  13. #13
    Membre habitué Avatar de rcageot
    Profil pro
    rien
    Inscrit en
    Septembre 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Septembre 2006
    Messages : 128
    Points : 170
    Points
    170
    Par défaut
    j'avoue que j'ai édité mon message, mais tu as du aller vite car il s'est passé moins d'une minute entre mon post et mon edit !
    tu as du copier le code dans cet intervale et faire la réponse après !
    ça m'aprendra à poster trop vite et à faire passer mes petits camarades pour des ignares

  14. #14
    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
    Citation Envoyé par rcageot
    si tu ne passes pas ta variable à ta sub il ne risque pas de la connaitre
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    sub test {
     local( $var) = @_;
     $var = uc($var);
     return($var);
    }
    $login=test("texte de ma variable") ;
    print $login;
    NB : Personnellement j'aurais plutôt critiqué l'usage de local() à la place de my(), ce sont des fonctions différentes et je préfère nettement my() pour ma part : je pense que l'usage du local() ne fonctionne pas sous le pragma strict (sauf si la variable globale a été déclarée avec our() ou use vars préalablement), et d'autre part, même si on n'est pas sous strict, cela fonctionne mais on se retrouve avec une variable globale "morte" qui traîne en-dehors de la fonction alors qu'elle n'y sert à rien, d'où un gaspillage de place... (Sans parler des dangers propres à local())

    --
    Jedaï

Discussions similaires

  1. [appeler une procédure stockée]
    Par viny dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 10/03/2005, 22h38
  2. Appel de Procédure stockée en ASP
    Par James85 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 14/11/2004, 17h55
  3. Appel de procédure par contenu de variable
    Par lil_jam63 dans le forum Langage
    Réponses: 9
    Dernier message: 13/09/2004, 08h05
  4. Appel de procédure dans une page ASP
    Par PrinceMaster77 dans le forum ASP
    Réponses: 5
    Dernier message: 02/04/2004, 16h59
  5. Appel de procédure...
    Par AmaX dans le forum Langage
    Réponses: 4
    Dernier message: 24/11/2002, 17h48

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