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] Pb incompréhensible avec un hash de hash !


Sujet :

Langage Perl

  1. #1
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    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 572
    Points : 2 014
    Points
    2 014
    Par défaut [langage] Pb incompréhensible avec un hash de hash !


    Bonjour,

    je dois charger dans un hash de hash des données issues d'un fichier texte standard.

    Le fichier texte contient des lignes de cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    1001=CHAMP1=toto
    1001=CHAMP2=pouet
    1001=CHAMP3=tutu
    1015=CHAMP1=coco
    1015=CHAMP2=cocot
    1015=CHAMP3=titi
    Chaque ligne contient en fait 3 valeurs que je récupère et elles sont séparées par le caractère "égal" ( = ). Ex pour la ligne 1 de mon exemple, 1001 me sert de clé dans mon hash, CHAMP1 me sert de clé dans le hash de hash et enfin, toto est la valeur de CHAMP1.

    J'ai en principe 3 lignes pour chaque clé 1001, 1015 etc.

    Le code que j'ai réalisé en premier est celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ($ligne_lue =~ /^([0-9]{4})=(CHAMP1|CHAMP2|CHAMP3)=(.+)$/) {
        $Hash{$1}->{$2} = $3;
    }
    else {
        warn "ligne inconnue : $.\n";
    }
    Ce que j'attend, c'est ceci par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $Hash{1001}->{CHAMP1} contient "toto"
               ->{CHAMP2} contient "pouet"
               ->{CHAMP3} contient "titi"
    Mon problème, c'est que mon hash, au lieu de rassembler tout ce qu'il trouve comme étant rattaché à la clé 1001 (exemple) en tant que hash de la clé 1001, il me duplique 1001 autant de fois qu'il le trouve dans mon fichier !!!

    Et ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $Hash{1001}->{CHAMP1} contient "toto"
     
    $Hash{1001}->{CHAMP1} contient "toto"
               ->{CHAMP2} contient "pouet"
     
    $Hash{1001}->{CHAMP1} contient "toto"
               ->{CHAMP2} contient "pouet"
               ->{CHAMP3} contient "titi"
    Comme vous le voyez, mon hash contient 3 fois la même clé 1001 !!!

    J'ai cité 2 exemples issus de mon fichier texte, mon hash devrait donc contenir 2 clés, chacune contenant 3 clés. Ben non, j'ai 6 clés au total !!!

    Je suis sous AIX 5 et avec Perl 5.8.0.

    Qqun peut-il me dire où j'ai déconné ???

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 53
    Points : 64
    Points
    64
    Par défaut
    je viens de tester et ca fonctionne :
    (mon data.txt contient tes lignes d'exemple ...)
    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
    25
     
    #!/usr/bin/perl
    use strict;
     
    my %Hash;
    open (FILE, "<data.txt") or die "Erreur open : $!\n";
    while(<FILE>)
    {
    	if ($_ =~ /^([0-9]{4})=(CHAMP1|CHAMP2|CHAMP3)=(.+)$/)
    	{
        	$Hash{$1}->{$2} = $3;
    	}
    	print (join "\t",@_). "\n";
    }
    close (FILE);
     
    # on affiche le hash
    foreach my $key(keys %Hash)
    {
    	my %new_hash=%{$Hash{"$key"}};
    	foreach my $key2(keys %new_hash)
    	{
    		print "$key : $key2 : $new_hash{$key2}\n";
    	}
    }
    les fautes d'orthographe de ce texte sont sous license GPL. Merci d'informer le proprietaire de la faute en cas de modification.

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    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 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Citation Envoyé par arthurr
    je viens de tester et ca fonctionne :
    (mon data.txt contient tes lignes d'exemple ...)
    Oui mais je viens à l'instant de trouver ma boulette (car c'est bien MA boulette

    Tu vois ton exemple là ? La boucle while, ben j'englobais dedans tout mon traitement !!

    Il m'a juste suffit de fermer ma boucle while juste avant de bosser sur le contenu de mon hash pour que ça fonctionne, désolé

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

Discussions similaires

  1. Parcours d'un hash de hash de hash
    Par ngere dans le forum Langage
    Réponses: 5
    Dernier message: 06/07/2005, 09h53
  2. [langage] Ptit Probleme expression réguliere avec perl
    Par Shoot Again dans le forum Langage
    Réponses: 3
    Dernier message: 02/12/2004, 12h44
  3. [langage] hash de hash
    Par Kinethe dans le forum Langage
    Réponses: 17
    Dernier message: 27/08/2004, 13h22
  4. Réponses: 19
    Dernier message: 03/08/2004, 10h26
  5. [langage] probleme avec un hash de hash
    Par planetevoyage dans le forum Langage
    Réponses: 4
    Dernier message: 06/06/2003, 12h55

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