Bonjour,
J'ai un problème en Perl que je n'arrive a résoudre avec mes propres connaissance et recherche sur google.
Je vous expose mon problème :
Je récupère depuis une base de donnée deux tableaux contenant dans le 1er des arborescences de dossiers et dans le second une liste de fichier.
Je souhaiterai à partir de ces deux tableaux créer un hash de hash par rapport au dossier et dont la valeur final et un tableau contenant les fichiers des dossiers.
Sachant que l'arborescence n'est pas fixe, il peut y avoir des sous dossiers,... .
Cela ne me pose pas de problème en "statique" comme ceci :
Ce qui me donne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 my @fichierdossier = ("test.txt","documentation.doc"); my @fichiersousdossier = ("read.pl","liste.pl"); my @fich1 = ("fichier1.txt", "fichier4.txt"); my @fich2 = ("fichier2.txt", "fichier5.txt"); my @fich3 = ("fichier3.txt", "fichier6.txt"); my %hash2 = (); $hash2{"user1"}{"dossier1"} = \@fichierdossier; $hash2{"user1"}{"dossier2"}{"sousdossier"} = \@fichiersousdossier; $hash2{"user2"}{"dossier2"}{"autredossier"} = \@fich1; $hash2{"user2"}{"dossier3"}{"encoredossier"} = \@fich2; $hash2{"user2"}{"dossier3"}{"otherdossier"}{"sousousdossier"} = \@fich3;
En revanche, le faire d'un façon "dynamique" me pose des soucis.
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 $VAR1 = 'user1'; $VAR2 = { 'dossier2' => { 'sousdossier' => [ 'read.pl', 'liste.pl' ] }, 'dossier1' => [ 'test.txt', 'documentation.doc' ] }; $VAR3 = 'user2'; $VAR4 = { 'dossier3' => { 'encoredossier' => [ 'fichier2.txt', 'fichier5.txt' ], 'otherdossier' => { 'sousousdossier' => [ 'fichier3.txt', 'fichier6.txt' ] } }, 'dossier2' => { 'autredossier' => [ 'fichier1.txt', 'fichier4.txt' ] } };
J'ai bien trouvé sur internet une façon de créer un hash de hash mais du coup je ne vois psa (comprend pas) à quel moment je peux passer la référence de mon tableau.
Voici dans les grandes lignes mon script actuel :
Le dump du hash donne ceci :
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
43
44
45
46
47
48
49
50
51
52
53
54 #!/usr/bin/perl -w use strict; use List::Compare; use Data::Dumper; use DBI; use CGI; my $co = new CGI; my $database="baseTest"; my $hostname="localhost"; my $login = "root"; my $mdp = "****"; my $dsn = "DBI:mysql:database=$database;host=$hostname"; my $dbh = DBI->connect($dsn, $login, $mdp) or die "Echec connexion"; my $requete = "SELECT localisation FROM dossiers "; my $sth = $dbh->prepare($requete); $sth->execute(); my @dossiers = $sth->fetchrow_array; $sth -> finish; my $ref = (); my $last = (); my %hash = (); my @fichiers = (); my @splitdossier = (); foreach my $var (@dossiers) { $requete = "SELECT name FROM fichiers WHERE locatedossier=$var"; $sth = $dbh->prepare($requete); $sth->execute(); @fichiers = $sth->fetchrow_array; $sth -> finish; @splitdossier = (); @splitdossier = split('/', substr($var,6)); $ref=\%hash; $last=pop(@splitdossier); foreach (@splitdossier){ $ref->{$_}={} unless (ref($ref->{$_})); #Nouvelle ligne $ref=$ref->{$_}; } $ref->{$last}++; } $dbh -> disconnect; print Dumper(%hash);
J'ai bien la structure voulue, mais ne sait pas quand affecter au hash mon tableau. Actuellement j'ai des 1 partout...
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 $VAR1 = 'user1'; $VAR2 = { 'dossier1' => 1, 'dossier2' => { 'sousdossier' => 1 } }; $VAR3 = 'user2'; $VAR4 = { 'dossier' => 1, 'autredossier' => { 'autresousdossier' => 1 } };
Si quelqu'un a une idée sur une possible solution.
Merci d'avance,
Cordialement,
Julien.






Répondre avec citation
Partager