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 :

Remplir une hash table au moyen d'une fonction


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Points : 15
    Points
    15
    Par défaut Remplir une hash table au moyen d'une fonction
    Bonjour,

    Je n'arrive pas à remplir une table de hash au moyen d'une fonction et de références (sans utiliser d'arguments en entrée de ma fonction). Quelqu'un saurait-il me dire ce qui ne vas pas dans mon script ?
    Merci;

    #! /user/bin/perl
    use strict;
    use warnings;
    use diagnostics;

    # déclaration initiale
    my $Valeur="";
    my $ref=\$Valeur;

    my %H=(
    'lulu'=>$Valeur,);

    # appel des fonctions
    remplir();
    lire();

    # déclaration des fonctions
    sub remplir {
    ${$ref} = "AAAA";
    }

    sub lire {
    foreach my $data (%H) {
    print ("$data\n");
    }
    }

  2. #2
    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 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    Prière d'utiliser les balises de code (le pictogramme '#' au-dessus de la fenêtre d'édition) pour tes bouts de code, cela permettra de respecter le formattage et l'indentation.

    Pas 100% sûr de ce que tu veux faire, mais ton problème n'a sans doute pas grand chose à voir avec les fonctions. Quand tu écris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my %H=(
                    'lulu'=>$Valeur,
                 );
    tu donnes à la clef 'lulu' du hash le contenu de la variable $Valeur au moment de l'assignation, à savoir "". Changer ultérieurement le contenu de $Valeur, que ce soit directement par une assignation ou autrement (par le truchement d'une référence) ne change plus rien. $H{lulu} contient maintenant "", et le programme n'a aucune raison de se souvenir qu'à l'époque où cet élément du hash a été alimenté, il l'a été avec le contenu de $Valeur.

    Essaie peut-être cette version simplifiée de ton programme pour t'en convaincre:

    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
    #! /user/bin/perl
    use strict;
    use warnings;
    use diagnostics;
     
    # déclaration initiale
    my $Valeur=1;
    my $ref=\$Valeur;
     
    my %H=('lulu'=>$Valeur,);
     
    $Valeur = 2;
    print $H{lulu}; # imprime 1
     
    ${$ref} = 3;
    print $H{lulu}; # imprime 1

  3. #3
    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 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    J'ajoute à ce que j'ai dit ci-dessus que les choses seraient différentes si tu avais écrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my %H=('lulu' => \$Valeur,);
    Car dans ce cas, le hachage contiendrait, pour la clef 'lulu', une référence vers la variable $Valeur, c'est à dire en gros l'adresse mémoire de cette variable. Dans ce cas, modifier la valeur de $Valeur modifiera aussi la valeur pointée par le hash pour la clkef 'lulu'.

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Oui, mais pour utiliser la valeur de la clé "lulu", il faudra ajouter un niveau de déréfencement (au lieu de $H{lulu} il faudra écrire ${$H{lulu}})
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Oui, mais pour utiliser la valeur de la clé "lulu", il faudra ajouter un niveau de déréfencement (au lieu de $H{lulu} il faudra écrire ${$H{lulu}})
    OK j'avais en effet plusieurs problèmes d'incompréhension, qui n'a rien à voir avec les fonctions : la valeur de lulu est remplie dans la table au moment de l’initialisation de la table ; ce n'est pas parce que la variable change par la suite que cela change dans la table. Puis comme le dit Philou67430, il faut rajouter un niveau de déréfencement. En combinant les réponse, ca fonctionne. Merci !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/07/2013, 14h33
  2. Réponses: 3
    Dernier message: 12/04/2013, 12h45
  3. Réponses: 3
    Dernier message: 29/08/2012, 12h33
  4. remplir une table access à partir d'une autre table
    Par Nacera dans le forum VBA Access
    Réponses: 1
    Dernier message: 27/12/2010, 15h14
  5. UPDATE d'une grande table ou INSERT d'une petite ?
    Par bibile dans le forum Requêtes
    Réponses: 4
    Dernier message: 18/04/2005, 10h09

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