Bonjour à tous,

Problème :
Imaginons que j'aie un tableau tel que :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
my @tab = ("h1","p","p","h1","p","h2","p","h1","p");
où :
  • h1 = titre de niveau 1
  • p = paragraphe
  • h2 = titre de niveau 2


J'aimerais obtenir un arbre tel que :
h1
---p
---p
h1
---p
---h2
--- ---p
h1
---p

de manière à ce que les "h1" soient coordonnés aux autres "h1", les "p" subordonnés au dernier "h_x" rencontré (et coordonnés entre "p") et les "h2" soient subordonnés aux "h1".

Dis autrement, à partir d'une séquence de scalaires représentant les éléments d'un document numérique, j'aimerais créer un arbre représentant la logique de ce document.


Ma première solution :
Il me paraît évident qu'il est nécessaire dans ce cas d'écrire une fonction récursive. Cependant, je cale à faire quelque chose qui fonctionne.

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
my @tab = ( "h1", "p", "p", "h1", "p");
 
&recursiv(0, "root");
my $last_indice;
sub recursiv {
	my ($indice, $previous) = @_;
 
	my $transition = &rules($indice, $previous);
 
	if($transition eq "sub"){
		print "<div>\n";
		my $new_indice = $indice + 1;
		$last_indice = &recursiv($new_indice, $tab[$indice]);
		print "</div>\n";
	}
	elsif($transition eq "coord"){
		print "\t<$tab[$indice]>\n";
		print "\t</$tab[$indice]>\n";
 
	}
	elsif($transition eq "up"){
		# On remonte au dernier appel de la fonction
		return $indice;
	}
 
}
 
# h1 - p : subordonné
# p - p : coordonné
# p - h1 : on remonte
 
sub rules{
	my ($indice, $previous) = @_;
 
	if($tab[$indice] eq "h1" && $previous eq "root"){
		return "sub";
	}elsif($tab[$indice] eq "p" && $previous eq "h1"){
		return "sub";
	}elsif($tab[$indice] eq "p" && $previous eq "p"){
		return "coord";
	}elsif($tab[$indice] eq "h1" && $previous eq "p"){
		return "up";
	}
}
Avez-vous un conseil à me donner?

D'avance, merci.