Si el navegador lo abre, es porque por la extensión y tipo MIME del fichero, el navegador ya es capaz de mostrarlo.
Los navegadores siempre intentan mostrar los ficheros que son capaces de reconocer. Por eso existe la opción, en el menú contextual del ratón, de grabar el enlace como un fichero, en lugar de descargarlo por el navegador.
Los archivos de texto sí que los puede mostrar fácilmente el navegador, por lo que siempre intentará mostrarlos.
Ahora bien, hay un truco...
Hay que conseguir que el navegador no descargue directamente el fichero, sino que se baje un fichero intermedio. Ese fichero intermedio le indicará las cabeceras correctas del fichero que realmente queremos que se baje. Entre esas cabeceras incluiremos una de ellas que obligue a sacar la caja de diálogo de Guardar/Salvar.
He encontrado
un ejemplo hecho para PHP (en inglés), pero es muy fácil de pasar para Perl.
El truco consiste en mandar el mismo
Content-Type del fichero, pero añadiremos un
Content-Disposition: attachment. Luego, abrimos el fichero y se lo enviamos al cliente como un torrente de bytes.