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 :

dereferencement de hash


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 25
    Par défaut dereferencement de hash
    Bonjour,

    j'ai un hash composé de clé (scalaire), et ayant comme valeur des references de tableau.

    je m'emmele les pinceaux pour dereferencer juste une valeur d'apres sa clé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @liste1= ("bleu" , "blanc" , "rouge");
    $ref1=\@liste1;
     
    @liste2 = ("vert","blanc","rouge");
    $ref2=\@liste2;
     
    %tab = ("france" , $ref1,
                "italie",$ref2 );
    comment déreferencer "vert" de la clé Italie?

    $tab(italie)->[0] ???

    merci encore

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    print $tab{"italie"}->[0];
    ou
    print $tab{"italie"}[0];

  3. #3
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 25
    Par défaut
    merci djibril

    une question toute bete pour eviter de creer un topic la dessus,

    ya t'il des risques d'erreur a referencer avec comme OS win xp?

    je dis ca, car ca me reference toujours sur la meme adresse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    open (FILE, "fichier.txt"); #listing separé par des tabulations
     
    while ($f =<FILE>) {
      @b = split /\t/,$f;    #découpage par tabulation
     
      $ref = \@b;    #ca me pose un probleme ici
      print "$ref";      # ca affiche toujours la meme adresse de reference
                         #alors que logiquement elle devrait etre differente
                         # a chaque tour de boucle
    }

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 606
    Par défaut
    Heu, question : d'où vient ton $h ???

    M'est avis que c'est pour ça que tu affiches toujours la même valeur

    Et pour répondre à ta question, le déréférencement fonctionne sous XP

    Edit : le saloupiot a corrigé son erreur

  5. #5
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 25
    Par défaut


    autrement le programme ecrit de cette façon est il juste?

    car j'ai l'intention ensuite de "pushé" les references dans un tableau, mais si elle sont toutes les meme ca me pose probleme

    et voila le "h"

    push(@h,$ref);

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 606
    Par défaut
    Je viens d'adapter rapidos ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $toto = "1  2   3   4";    # tabulation entre les valeurs
    @b = split /\t/,$toto;
     
    $ref = \@b;
    print "$ref";    # m'affiche ARRAY(0x1ab2790)
    C'est bien ce que tu voulais ?

  7. #7
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 606
    Par défaut
    Citation Envoyé par STEPH69000
    push(@h,$ref);
    Essaie ceci plutôt : push(@h, @$ref);

    Je crois que là, tu devrais avoir ce que tu cherches

  8. #8
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par STEPH69000
    merci djibril

    une question toute bete pour eviter de creer un topic la dessus,

    ya t'il des risques d'erreur a referencer avec comme OS win xp?

    je dis ca, car ca me reference toujours sur la meme adresse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    open (FILE, "fichier.txt"); #listing separé par des tabulations
     
    while ($f =<FILE>) {
      @b = split /\t/,$f;    #découpage par tabulation
     
      $ref = \@b;    #ca me pose un probleme ici
      print "$ref";      # ca affiche toujours la meme adresse de reference
                         #alors que logiquement elle devrait etre differente
                         # a chaque tour de boucle
    }
    Tu fais ici une erreur courante, que tu aurais évité sans t'en aperçevoir si tu avais utilisé "use strict;" (je te recommande plus que fortement de le faire !!!!!). En fait dans tout ton programme il n'y a qu'une seule variable globale @b (puisque tu la déclare sans my()), pas une par boucle. Aussi quand tu prend sa référence, c'est toujours la même (c'est toujours le même tableau, seul son contenu change)... Logique !

    Pour éviter ça, il y a plusieurs solutions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    use strict; use  warnings;
     
    open my $listing_in, "fichier.txt" #listing separé par des tabulations
      or die "$!\n";
     
    while (my $line =<$listing_in>) {
      my @b = split /\t/,$line;    # maintenant @b est une variable locale, recréé à chaque
                                              # itération de la boucle
     
      my $ref = \@b;    # comme @b est une variable différente à chaque fois,
      print "$ref";   # la référence vers @b est différente à chaque fois.
    }
    C'est sans doute une bonne solution, mais pas toujours applicable.
    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
     
    use strict; use  warnings;
     
    open my $listing_in, "fichier.txt" #listing separé par des tabulations
      or die "$!\n";
     
    # ...
    # supposons que tu déclares @b hors de la boucle pour une raison quelconque :
    my @b;
     
    # ...
     
    while (my $line =<$listing_in>) {
      @b = split /\t/,$line;    # maintenant @b est une variable locale mais créée à l'extérieur de 
                                        # la boucle, elle est unique pour toutes ses itérations...
     
      my $ref = [ @b ];    # en utilisant [ ] on reconstruit un nouveau tableau ayant le même
                                        # contenu que @b à ce moment précis, puis on renvoie une référence
                                        # sur ce nouveau tableau.
      print "$ref";   # la référence vers @b est différente à chaque fois.
    }
    Cette deuxième solution est plus universelle, mais sur des très gros tableaux elle peut-être inenvisageable à cause du coût de la copie.

    --
    Jedaï

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Par défaut
    Salut,

    pourquoi pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #!/usr/bin/perl
     
    use strict; use  warnings;
     
    open my $listing_in, "fichier.txt" #listing separé par des tabulations
      or die "$!\n";
     
    while (<$listing_in>) {
      my $ref = [ split /\t/,$_ ];
      print "$ref";
    }
    ?!

    lami20j

  10. #10
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 25
    Par défaut
    merci pour cette petite leçon, j'en ai pris note.

    et j'ai réussi à resoudre mon probleme

    merci de votre participation

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

Discussions similaires

  1. [langage] reference et hash complex
    Par mlo dans le forum Langage
    Réponses: 4
    Dernier message: 07/07/2004, 17h46
  2. [langage] hash
    Par giverny dans le forum Langage
    Réponses: 3
    Dernier message: 12/08/2003, 11h27
  3. [langage] probleme avec un hash de hash
    Par planetevoyage dans le forum Langage
    Réponses: 4
    Dernier message: 06/06/2003, 12h55
  4. [langage] Créé un hash dans un fichier...
    Par Smooky dans le forum Langage
    Réponses: 3
    Dernier message: 26/03/2003, 08h49
  5. Tables de hash
    Par miss8 dans le forum C
    Réponses: 2
    Dernier message: 16/11/2002, 17h44

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