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

  1. #1
    Membre à l'essai
    Ajouter des éléments dans un hash de hash pré-existant sans rien supprimer
    Bonjour à tous et à toutes
    Après avoir passé 3 jours sur le net pour essayer de répondre à ma question, je viens vers vous dans l'espoir de trouver une solution à mon problème...
    Alors voilà, je suis encore un peu novice dans le langage PERL et j'ai encore du mal à manipuler les tables de hash de hash.
    Au départ j'ai 2 fichiers .tsv; je crée une table de hash pour récupérer les éléments de mon premier fichier. Mon 2e fichier comporte les clés de mon hash.
    Je veux ajouter/enrichir mon hash d'informations supplémentaires que comporte mon 2e fichier grâce aux clés (de premier niveau).


    exemple :

    Fichier1.tsv

    identifiant1
    courir
    parc
    identifiant2
    marcher
    montagne
    ...


    Fichier2.tsv

    identifiant1 chaussures baskets bleus marqueA
    identifiant1 haut débardeur jaune marqueB
    identifiant2 chaussures chaussures de randonnées marron marqueC
    identifiant2 bas short orange marqueD


    Ce que j'aimerai :

    Si je fais un print pour avoir mon hash de départ après avoir parcouru Fichier1.tsv:

    %hash = (
    identifiant1 => {
    fonction => 'courir',
    lieu => 'parc'
    }
    identifiant2 => {
    fonction => 'marcher',
    lieu => 'montagne'
    }
    ...

    );



    si je fais un print de mon hash après lecture du Fichier2.tsv:
    %hash = (
    identifiant1 => {
    'fonction' => courir,
    'lieu' => parc,
    'habits' => {
    chaussures => {
    'type' => baskets,
    'couleur' => bleus,
    'marque' => marqueA
    }
    haut => {
    'type' => débardeur,
    'couleur' => jaune,
    'marque' => marqueB
    }
    }
    identifiant2 => {
    'fonction' => marcher,
    'lieu' => montagne,
    'habits' => {
    chaussures => {
    'type' => chaussures de montagne,
    'couleur' => marrons,
    'marque' => marqueC
    }
    bas => {
    'type' => short,
    'couleur' => orange,
    'marque' => marqueD
    }
    }
    );


    Voici mon code :

    #!/usr/bin/perl -w

    # Usage : ./enriched_hash.pl fichier1.tsv fichier2.tsv


    use Data:: Dumper qw(Dumper);


    $GU = $ARGV[0];
    $inter = $ARGV[1];


    my %hash;

    open FICHIER1, $GU;

    while(<FICHIER1>) {
    chomp;

    @ligne = split(/\t/, $_);


    $hash{$ligne[0]}{'fonction'} = $ligne[1];
    $hash{$ligne[0]}{'lieu'} = $ligne[2];

    }

    close FICHIER1;


    print Dumper \%hash;
    print "____________________\n";


    open FICHIER2, $inter;

    while(<FICHIER2>) {
    chomp;

    @line = split(/\t/, $_);

    $hash{$line[0]}{'habits'}{$line[1]}{'type'} = $line[2];
    $hash{$line[0]}{'habits'}{$line[1]}{'couleur'} = $line[3];
    $hash{$line[0]}{'habits'}{$line[1]}{'marque'} = $line[4];

    }

    close FICHIER2;


    print Dumper \%hash;
    print "____________________\n";



    Le problème étant : que mon hash de hash n'a plus du tout les fonctions et le lieu du premier niveau.

    Comment dois-je faire pour obtenir ce que je veux?

    Edit: j'ai retiré le préfixe "Perl 6" de l'intitulé de ton post car il ne concerne manifestement pas Perl 6 (mais Perl 5). Cordialement. Lolo78.

  2. #2
    Rédacteur/Modérateur

    Bonjour,
    peux-tu montrer ce que tu obtiens (sortie Data Dumper) avec ton programme actuel?

  3. #3
    Rédacteur/Modérateur

    Bonsoir,

    voici un exemple qui fait, me semble-t-il, à peu près ce que tu désires:
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    use strict;
    use warnings;
    use Data:<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />umper;
     
    my $fic1 = 
    'identifiant1 courir parc
    identifiant2 marcher montagne';
    my %hash;
     
    open my $FIC1, "<", \$fic1 or die "Ouverture impossible de $fic1 $!";
    while (my $line = <$FIC1>) {
    	chomp $line;
    	my ($id, $activity, $place) = split /\s/, $line;
    	$hash{$id} = { fonction => $activity, lieu => $place };
    }
     
    print Dumper \%hash;
    print "==================\n";
     
    while (my $line = <DATA>) {
    	chomp $line;
    	my ($id, $vetement, $type, $color, $marque) = split /\t/, $line;
    	$hash{$id}{$vetement} = { type => $type, couleur => $color, marque => $marque };
    }
     
    print Dumper \%hash;
     
     
     
    __DATA__
    identifiant1	chaussures	baskets	bleus	marqueA
    identifiant1	haut	débardeur	jaune	marqueB
    identifiant2	chaussures	chaussures de randonnées	marron	marqueC
    identifiant2	bas	short	orange	marqueD


    Voici l'affichage obtenu:

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    $ perl HoH.pl
    $VAR1 = {
              'identifiant2' => {
                                  'fonction' => 'marcher',
                                  'lieu' => 'montagne'
                                },
              'identifiant1' => {
                                  'fonction' => 'courir',
                                  'lieu' => 'parc'
                                }
            };
    ==================
    $VAR1 = {
              'identifiant2' => {
                                  'fonction' => 'marcher',
                                  'lieu' => 'montagne',
                                  'chaussures' => {
                                                    'marque' => 'marqueC',
                                                    'type' => 'chaussures de randonnées',
                                                    'couleur' => 'marron'
                                                  },
                                  'bas' => {
                                             'marque' => 'marqueD',
                                             'type' => 'short',
                                             'couleur' => 'orange'
                                           }
                                },
              'identifiant1' => {
                                  'fonction' => 'courir',
                                  'lieu' => 'parc',
                                  'chaussures' => {
                                                    'marque' => 'marqueA',
                                                    'type' => 'baskets',
                                                    'couleur' => 'bleus'
                                                  },
                                  'haut' => {
                                              'marque' => 'marqueB',
                                              'type' => 'débardeur',
                                              'couleur' => 'jaune'
                                            }
                                }
            };

  4. #4
    Membre à l'essai
    En fait c'est un exemple que j'avais fait mais apparemment avec le code que j'ai écrit sur ce forum ça fonctionne. Pourtant avec les données que j'ai ça ne marche pas aussi bien.

    J'ai regardé ce que tu as fait et c'est plus ou moins ce que j'avais fait mais tu l'as clairement mieux organiser que moi

    Finalement, j'ai réussi à trouver un moyen pour que mes clés (de 1er niveau) ne soient pas supprimer lorsque j'appelle ma table de hashage avec ce type de clés avec le 2e fichier.
    J'utilise tout simplement le référencement.

    En clair, j'ai fait

    $ref = \%hash

    if (exists $$ref{$ligne[0]}) {
    ...instructions...
    }

    En fait $$ref est la même chose que %hash


    Merci en tout cas pour tes réponses aussi rapides et ton code