Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Programmation et administration système
Programmation et administration système Vos questions sur les scripts d'administration système, création de compte utilisateur, socket, fork, ping, etc...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 13/06/2012, 10h28   #1
Peps16
Nouveau Membre du Club
 
Inscription : décembre 2011
Messages : 26
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 26
Points : 39
Points : 39
Par défaut creation récursive d'un hash

Bonjour je travail actuellement sur un outil dont j'ai besoin pour configurer des vues sous Clearcase et pour cela j'ai besoin de générer un hash contenant l'arborescence de mes modules et sous modules.

En gros pour faire simple, j'aurais besoin de passer une liste à ma fonction:

Code :
my @list = ("a/b/c","a/b/d")
et de récupérer en résultat un hash de la forme:

Code :
1
2
3
4
5
6
7
8
9
 
$hash = {
                 a => {
                              b => {
                                           c => {},
                                           d => {}
                              }
                 }
}
J'ai essayé de faire une telle fonction mais mon hash ne contient seulement la structure du dernier élément de la liste.

Voici ma fonction :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
sub setHash{
	my $listModule = shift;
	my $tree = {};
 
	my @listArr = split("/",$listModule);
	while(scalar(@listArr)>0){
		my $elem = shift(@listArr);
		$tree->{$elem} = setHash(join('/',@listArr));
		return $tree;
	}
	return $tree;
}
Si par hasard quelqu'un aurait une idée ça serait super.
Peps16 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2012, 10h55   #2
Gardyen
Membre chevronné
 
Avatar de Gardyen
 
Inscription : août 2005
Messages : 494
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France

Informations forums :
Inscription : août 2005
Messages : 494
Points : 676
Points : 676
Envoyer un message via ICQ à Gardyen
miam du récursif

Voilà une solution possible.

Différence avec ton script:
- passage de l'arbre 'parent' où doit s'enregistrer le module, ce qui permet la récursion
- le parcours de la liste est en dehors de la boucle de récursion, vu que le même traitement est effectué sur chaque élément de cette liste

si tu as des questions...
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
sub setHash{
	my $listModule = shift;
	my $tree = shift;
 
	# get the module
	my @listArr = split("/",$listModule);
	my $elem = shift(@listArr);
 
	# initialize the tree if not created
	if (!defined $tree->{$elem}){
		$tree->{$elem} = {};
	}
	if (scalar @listArr){
		setHash(join('/',@listArr), $tree->{$elem});
	}
	return $tree;
}
 
 
my @list = ("a/b/c","a/b/d");
my %all_trees;
foreach my $module (@list){
	setHash($module, \%all_trees);
}
print Dumper %all_trees;
__________________
Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
Plus les choses changent, plus elles restent les mêmes
Gardyen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2012, 13h44   #3
Peps16
Nouveau Membre du Club
 
Inscription : décembre 2011
Messages : 26
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 26
Points : 39
Points : 39
Je te remercie, c'est exactement ce que je recherchais.

J'ai trouvé une solution mais elle est plus complexe. La tienne me semble plus simple à comprendre et elle est certainement plus rapide à exécuter.

Merci beaucoup
Peps16 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h44.


 
 
 
 
Partenaires

Hébergement Web