Hmm,
so richtig werde ich aus Deinem Code auch nicht schlau. Aber: Schau Dir mal File::Find an sowie die Dateitestoperatoren, speziell -f (file) und -d (directory).
Dirs, die ausgeblendet werden sollen, kannst Du ja spezielle flags geben.
File::Find geht rekursiv und effektiv durch Verzeichnisbäume.
Besser finde ich ein selbst aufgestelltes Abbild der Verzeichnisstruktur. z.B. in einer ini-Datei. Damit ist ein CGI besser steuerbar. Außerdem lassen sich beliebig viele weitere Attribute unterbringen. Guck mal:
[Ordner]
title = ...
description = ...
[Ordner.Subordner]
title = ...
description = ...
usw.
use Config::IniFiles; # und so mache ich das
Hotte