Problème avec un hash de tableau de hash
Hello,
Après des heures d'essais, je donne ma langue au chat. J'essaie de charger une liste de fichiers csv. Chaque ligne est stockée dans une table de hachage ayant comme clé, le nom de la colonne d'entête.
Ensuite je stocke chacun de ces hash dans un tableau ce qui me représente un fichier. J'ai donc un tableau de table de hachage par fichier.
Je fini par stocker ces fichiers dans une table de hachage ayant comme clé le nom du fichier et comme valeur mon tableau de table de hash.
Code:
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
|
my $filedir = "/export/home/lls/files";
my %files;
$evalerror="NoError";
eval{
$SIG{__WARN__} = sub { $evalerror= join (":", @_) . "\n"; };
opendir(DIR,"$filedir");
my @filenames = readdir(DIR);
foreach $file (@filenames){
next if ($file=~ /^\.+$/); # We skip . and ..
open (FILE,"$filedir/$file");
$file=~ s/\..*//; #We remove the extension
my $fileline = 0;
my @headers = ();
my @filedata = ();
my $rowsize;
while (<FILE>){
my %rowdata;
my @row;
if ($fileline == 0){
@headers = split(/;/,$_);
$rowsize = @headers;
}else
{
@row = split(/;/,$_);
for (my $i = 0; $i < $rowsize; $i++){
$rowdata{$headers[$i]} = $row[$i];
}
push @filedata, {%rowdata};
}
$fileline++;
}
$files{$file} = [@filedata];
}
}; |
Le remplissage semble se passer correctement car si à la fin de ceci je fais un :
Code:
print $files{fichier1}[2]{colonne3}
Il m'affiche bien la troisième colonne de la 3eme ligne du fichier 1.
Sauf que maintenant j'ai besoin de parcourir cette structure. J'essaye par exemple :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
@valorsinposition = $files{ValorPosition};
@valors = $files{Valor};
foreach $valorinposition (@valorsinposition){
my $valorfound = 0;
foreach $valor (@valors){
if ($valorinposition{valorId} eq $valor{Id}){
$valorfound = 1;
last;
}
}
if (not $valorfound){
print "Valorposition $valorinposition{valorId} not found in table Valor !\n";
}
} |
cela ne fonctionne pas. Il semblerait que mes @valorsinposition et @valors soient des tableaux de tableaux de hash :
DB<15> p @valors --->ARRAY(0x4d2978)
DB<16> p $valors[0] --->ARRAY(0x4d2978)
DB<17> p $valors[0][0] --->HASH(0x500fdc)
Je suis persuadé que j'ai dû faire une bêtise ... mais là .. je sèche.
Si quelqu'un a une once d'idée, j'en serai ravis
Thanks
Hy00ga