Bienvenido a los foros de Perl en Español, Alex0520.
Como dice Jenda, una opción es estudiar el código de los módulos File::. O usarlos directamente.
En cuanto al código tuyo, hay una serie de problemas...
Al tratarse de una función recursiva, no debes permitir que las variables que almacenan información en un estado o contexto, pasen a la siguiente llamada de la función.
En tu código, estás usando la variable @archivos para guardar los archivos que hay en cada directorio en que entras. Luego inicias un bucle por todos ellos. Si son ficheros normales haces la prueba de la exp. reg., pero si son directorios, vuelves a llamar a la función. Y aquí está el primer fallo: cuando entra la función a analizar el contenido de ese directorio, sobreescribe el contenido anterior de @archivos.
La solución es la de siempre: hacer que las variables sean locales en el contexto donde están.
Con poner
my @archivos = = readdir(DIR);, vale. De esa manera, se crea una nueva variable @archivos, que es independiente de las siguientes ejecuciones de la subrutina.
Otro detalle es el funcionamiento de opendir(). En la línea 6 le pides que abra el $directorio y que te devuelva luego el contenido del mismo. Hasta ahí, bien. El problema está luego en la línea 19: estás ejecutando la función con el nombre del nuevo directorio encontrado (en la variable $archivo), PERO resulta que este nombre de archivo es RELATIVO a la posición del $directorio abierto por opendir(). Un ejemplo para aclarar las cosas:
Suponemos que estamos en el directorio actual ('
.'). Y que el programa lo ejecutamos en este mismo directorio. Como a lo largo del programa y de la subrutina NO realizamos ninguna operación chdir(), NO estamos cambiando de directorio. Seguimos en el primero.
Supongamos que el contenido del directorio es:
Using text Syntax Highlighting
.
..
mame/
juegos.txt
README
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Bien, esto es lo que nos devuelve la primera llamada a opendir(). Tenemos 3 directorios y dos ficheros normales. De los directorios '.' y '..' no tenemos que preocuparnos porque les desechamos enseguida. La cuestión es cuando llegamos al primer directorio.
$archivo vale 'mame' y se activa la condición '-d', así que pasamos a la línea 19 del código, donde llamamos a la misma función, pasando como argumento 'mame'. Bueno. Perl llega de nuevo a la línea 6 y, efectivamente, le estamos pidiendo que abra el directorio 'mame' y que nos dé los ficheros que hay dentro. Ahora viene el problema.
Supongamos que ahora, el contenido de 'mame' es el siguiente:
Using text Syntax Highlighting
.
..
roms/
conf/
dir/
mame
mame.txt
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Lo mismo de antes, nos olvidamos de los '.' y '..' y pasamos al primer directorio que se encuentra: 'roms'. Se vuelve a repetir lo de antes: llamamos a la función pasando 'roms' como argumento. Y falla. Falla porque SEGUIMOS estando en el directorio '.' y ahora le estamos pidiendo a opendir() que abra un directorio llamado 'roms'. Y claro: NO HAY ningún directorio así en el lugar donde estamos trabajando. Ese directorio está dentro de otro directorio que sí cuelga del directorio donde estamos.
El problema está claro: opendir() no devuelve el camino completo. Solo devuelve los nombres de los ficheros/directorios del directorio que estamos abriendo, pero sin su ruta completa.
La solución es pasar a la función de llamada el camino completo. Cambiamos la línea 19 por
buscarxtitulo("$directorio/$archivo",$parametro);. De esa manera vamos arrastrando en todas las llamadas la ruta completa.
Y por exactamente la misma razón, las líneas 13 y 18 fallarán: estamos preguntando si $archivo es un fichero o un directorio, pero referidos siempre al directorio de trabajo donde estamos. Y eso no es cierto cuando queremos mirar dentro de otros subdirectorios. Hay que cambiar esas líneas para que usen una ruta completa.
Inténtalo ahora.