2014-04-30 1 views
0

J'ai un hachage de hachages où, au dernier niveau, je veux que chaque valeur soit ajoutée - non mis à jour - si cette valeur existe déjà. Quelle serait la meilleure façon de faire cela? Je pensais à faire les valeurs sous forme de listes, mais c'est probablement pas la façon la plus efficace ...Comment ajouter de nouvelles valeurs au hachage en Perl

est ici où je suis arrivé à ce jour:

#!/usr/local/bin/perl 
use strict; 
use warnings; 
use Data::Dumper; 

my $dir='D:\'; 

open my $data,"<","$dir\\file.txt"; 

my (@selecteddata,@array,%hash); 

while (<$data>) { 
    chomp $_; 
    my @line= split "\t"; 

    $hash{$line[1]}{$line[2]}=$line[0]; 
    warn Dumper \%hash; 
} 
close $data; 

Remarque, ce code met à jour les valeurs au dernier niveau avec la valeur $line[0], mais si la clé $line[4] existe déjà (ce qui signifie, il a déjà une valeur précédente $line[0]) Je veux que cette valeur soit ajoutée et non mise à jour.

Ainsi, idéalement, pour les éléments suivants (onglet sepparated) Liste:

a1 b1 c1 
a2 b2 c2 
a3 b3 c3 
a4 b4 c4 
a5 b4 c4 

Le hachage ressemblerait à quelque chose comme ça - je ne sais pas exactement comment le regroupement des a4 et a5 devrait ressembler, si tant qu'ils sont regroupés, il devrait être ok:

{ 
    'b1' => {'c1' => 'a1'}, 
    'b2' => {'c2' => 'a2'}, 
    'b3' => {'c3' => 'a3'}, 
    'b4' => {'c4' => 'a4, a5'} 
} 

Répondre

4

Vous pouvez ajouter votre chaîne,

$_ = defined($_) ? "$_, $line[0]" : $line[0] 
    for $hash{$line[1]}{$line[2]}; 

ou utiliser tableau qui est mieux adapté pour stocker la liste des éléments,

push @{ $hash{$line[1]}{$line[2]} }, $line[0]; 
Questions connexes