Puede deberse a un montón de razones:
1.- El servidor web no tiene acceso al directorio del fichero porque está enjaulado (chroot).
2.- No hay permisos para leer dentro de la carpeta que contiene el fichero.
3.- No hay permisos para leer el fichero.
4.- El usuario que ejecuta el cgi suele ser el mismo usuario que ejecuta el servidor web. Según sea y según pertenezca a un grupo u otro, podrá abrir el fichero o no dependiendo de los permisos concedidos al grupo o al resto del mundo.
5.- Lo mismo se puede decir en caso de querer abrir el fichero en modo escritura.
Ejecuta el cgi de esta manera para saber qué ocurre:
open FILE,"<fichero" or die "ERROR: No pude abrir el fichero: $! \n";
La variable $! mostrará el mensaje de error con la causa.
Si no puedes ver el error en los registros de actividad del servidor web, prueba a usar
use CGI::Carp qw(fatalsToBrowser);
y los errores saldrán en el navegador web.