No necesitas escribir todo ese mamotreto de línea para mandar las cabeceras.
Si te hubieras fijado en los CGI que hay por estos hilos (y en el CGI mínimo en particular), verías que toda esa línea se puede reducir a
Using perl Syntax Highlighting
print header
;Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
gracias a la presencia del módulo CGI.
En cuanto al desarrollo...
Yo te aconsejo que adoptes la técnica del "paso a paso" junto con la de "dónde demonios estamos".
La primera técnica se refiere a que construyas un cgi que, simplemente, funcione, aunque no haga nada. Y a continuación, irle agregando más pasos. Por cada paso, lo vuelves a ejecutar. Y no solo miras el resultado en la ventana del navegador: también debes mirar el código HTML que se ha generado, y también debes mirar los registros que el servidor web ha guardado en los ficheros
log.
En cuanto llegues a un paso que provoque un error, sabrás que has localizado la primera piedra del camino. Repasa las líneas que acabas de meter, y si no ves qué es lo que pasa, lo mandas aquí.
La segunda técnica consiste en poner print() en todos los pasos del programa, del estilo:
print "El programa acaba de leer la lista de todos los parámetros CGI\n";, o
print "Parámetros pasados al programa: ", param(), "\n";, o
print "Ejecutando programa externo [$comando]\n";.
En tu caso, el principal problema quizás sea la ejecución de programas externos. Bueno, pues la
misma línea que le pasas a system() o qx(), antes se la pasas a print(), para ver qué es lo que estás ejecutando.
También, debes comprobar si lo que esperas, existe: si esperas leer un fichero, debe haber un die() si ese fichero no existe. Si ejecutas un programa y como resultado de ello debe generarse un fichero, con un test
-e puedes comprobar que realmente se ha creado. Etc.
Aquí hay una "pequeña" dificultad añadida: al ser un cgi, los print() normales saldrán
dentro del código HTML generado, por lo que seguramente saldrá mezclado y no se verá bien. Hay dos opciones:
- en vez de print(), a veces suelo usar warn(), que lo que hace es enviar esos mensajes al fichero error.log del servidor web. O, también:
- la salida de un print la embuto dentro de una marca HTML <pre>, así: print pre("mensaje: ");. Así, la salida sale preformateada en letra monoespaciada, y es más fácil de ver (como por ejemplo, las salidas del Dumper() de Data::Dumper).
También dices que si ejecutas los programas desde la línea de comandos, funcionan. Entonces, yo deduzco que el problema no está con los programas Perl, sino con su ejecución por parte del servidor web. Con las técnicas anteriores sabrás dónde falla.