Horst: Baum-Menü mit Perl erzeugen

Beitrag lesen

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;  
}