He probado la versión 2.5 y me funciona, salvo que falta cerrar el final del fichero recomendación (el R).
Otro problema es que si se vuelve a ejecutar el programa, no sobreescribe los ficheros html, sino que añade nuevo contenido, lo cual no es coherente con el hecho de que siempre genera una cabecera HTML. Deberían ser abiertos en modo escritura, no en modo añadir. Y agregar la hora de la ejecución en el nombre del fichero.
Y el código HTML tiene cantidad de errores... los atributos no están entrecomillados, hay caracteres ';' que sobran... el DTD no corresponde con la forma de escritura de las marcas HTML... casi mejor, quitarlo...
Por otra parte, sabiendo que en las distribuciones Perl viene incluido de base el módulo CGI, podrías aprovecharlo para generar el código HTML, y reducir tu programa a la mitad.
Y si ejecutamos el programa con los avisos activados (no desactivados, como lo tienes puesto), Perl te da más pistas:
Using text Syntax Highlighting
explorer@aprosi21:~/Documents/tmp> perl -c checklist-2.0.4.pl
Switch will be removed from the Perl core distribution in the next major release. Please install it from CPAN. It is being used at checklist-2.0.4.pl, line 29.
Variable "%uid" will not stay shared at checklist-2.0.4.pl line 273.
Variable "%gid" will not stay shared at checklist-2.0.4.pl line 275.
Name "main::defaultuser" used only once: possible typo at checklist-2.0.4.pl line 151.
Name "main::archivos" used only once: possible typo at checklist-2.0.4.pl line 177.
checklist-2.0.4.pl syntax OK
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
O sea:
* Switch es un módulo maldito, así que no hay que usarlo. Hay que usar given/when
* Las variables defaultuser y archivos no se usan nunca
* Las variables %uid y %gid están en contextos diferentes, por lo que los cambios externos en ellas no se verán en sucesivas llamadas en la función que luego las usa. En tu caso, te avisa que la función wanted3() está definida dentro de la función sinownergroup(), por lo que, de las variables %uid y %gui que referencia, y que están declaradas y definidas fuera de ella, solo usará el
primer valor que tuvieran, y no los posteriores. En tu caso, no te afecta, porque la función sinownergroup() solo se llama una vez.