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 :
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;
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
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'
                                            ]
                        }
        };
En revanche, le faire d'un façon "dynamique" me pose des soucis.
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 :

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);
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
 
$VAR1 = 'user1';
$VAR2 = {
          'dossier1' => 1,
          'dossier2' => {
                         'sousdossier' => 1
                       }
        };
$VAR3 = 'user2';
$VAR4 = {
          'dossier' => 1,
          'autredossier' => {
                         'autresousdossier' => 1
                       }
        };
J'ai bien la structure voulue, mais ne sait pas quand affecter au hash mon tableau. Actuellement j'ai des 1 partout...

Si quelqu'un a une idée sur une possible solution.

Merci d'avance,
Cordialement,
Julien.