Ich mache sowas mit einer Rekursion, Code siehe weiter unten,
Hotte
Die Liste enthält Gliederungspunkte einer Hierarchie und soll nun in HTML in einer <ul> </ul>
mit den entsprechenden Einrückungen dargestellt werden.
my @li = qw(
1
1.1
1.1.1
1.1.2
1.2
1.2.1
1.2.2
1.3
2
2.1
2.1.1
2.1.2
2.2
2.2.1
2.2.2
2.3
);
Es braucht eine Hilfsfunktion dir() welche für jeden Listenpunkt ein Array mit der nächsten
Ebene der Unterpunkte zurückgibt.
Dann kann mit einer Rekursion die Liste in HTML erstellt werden.
dir(\@li); # gibt die Punkte der ersten Ebene zurück als Liste, hier 1 und 2
dir(\@li, '1'); # gibt die Unterknoten für 1 zurück als Liste
Zum Erstellen des Gesamtbaumes muss die traverse() Funktion über die Liste der Punkte
der ersten Ebene aufgerufen werden:
print "<ul>\n";
foreach my $d( dir(\@li) ){ traverse($d) }
print "</ul>\n";
Zum Darstellen eines Zweiges einfach die traverse() Funktion wie folgt aufrufen:
print "<ul>\n";
traverse('1');
print "</ul>\n";
###########################################################################
# Die Rekursionsfunktion
sub traverse{
my $dir = shift;
my @subdirs = dir(\@li, $dir);
if(@subdirs){
print qq(<li> $dir <ul>\n);
foreach my $subdir(@subdirs){
traverse($subdir);
}
print "</ul></li>\n";
}
else{
print qq(<li> $dir </li>\n);
}
}
###########################################################################
# Gibt die Unterordner der naechsten Ebene als liste zurueck
sub dir{
my ($ref, $dir) = @_;
my @a = @$ref;
my @al;
if($dir){
foreach my $n(@a){
if($n =~ /^$dir\.(\d+)$/){
$1 and push @al, "$dir.$1";
}
}
}
else{
foreach my $n(@a){
if($n =~ /^\d+$/){
push @al, $n;
}
}
}
return @al;
}