Se me ocurre dividir el problema en partes...
Primero, un programa que vigile los cambios en los directorios donde están los ficheros. Se puede usar un
cron, por ejemplo, que mire a ver si hay cambios. O usar el propio sistema operativo para que te informe de que hay un cambio en el árbol de ficheros (en Windows y Linux se puede hacer sin muchos problemas).
Desde Perl, se puede realizar con módulos como
Filesys::Notify::Simple (para Linux y MacOS X) y
Win32::FileNotify (para Windows).
Entonces, este programa queda esperando por los cambios. En caso de que ocurran, se lee todos los ficheros de todos los directorios y crea un nuevo fichero con todos ellos reunidos, con solo dos columnas (dominio/URL y categoría).
Segundo, el programa que hace de servidor, al arrancar, lee el fichero y lo pasa a un
hash, y se queda en un bucle esperando por las peticiones externas (si dices que tiene que ser un servicio web, se podría hacer con algún módulo tipo HTTP::Server, y con fork() para responder a varios al mismo tiempo, etc). Antes de servir una petición, puede mirar a ver si el fichero ha cambiado (con el operador -M, por ejemplo). Si ha cambiado, reinicia el proceso de carga del fichero. Y luego sirve la petición.
Bueno, esto es una idea, pero seguro que hay formas mejores.
Con pperl, hay un problema: está sin actualizar desde el 2004, por lo que ya no es compatible con los Perl modernos.
Lo recomendado, entonces, es usar
FCGI (Fast CGI). Con el módulo
CGI::Fast se puede crear, fácilmente, un proceso CGI que queda persistente y puede responder a la petición web, de forma rápida.