El primer error se te va si consigues utilizar una alternativa al system.
Y el segundo error se te va si escribes la imagen en un directorio en el que tengas permiso de escritura Y sea accesible por el usuario que corre el web. Eso es justo lo que te está diciendo el error: que has generado la imagen en el propio directorio cgi-bin, y ese directorio sólo sirve para guardar programas.
Un ejemplo.
Si el web lo tienes colgando de /var/www/misitioweb/ entonces creas el subdirectorio tmp dentro de ese camino.
Le das permiso al directorio tmp para que sea escribible por el usuario que corre el servidor web y por el usuario propietario de los ficheros (puede ser el mismo): chown slopal.www-data tmp; chmod 775 tmp;.
En el programa, el proceso que puedes hacer es:
1.- Entra en el directorio tmp/: chdir /var/www/misitioweb/tmp;
2.- Haces un listado con todas las imágenes disponibles: my @imagenes = <imagen*.gif>;
3.- Haces un bucle por todas ellas y te cargas todas las viejas:
foreach my $imagen ( @imagenes ) {
unlink $imagen if -M $imagen > 3; # Borrar en caso de tener más de 3 días
}
4.- En función de los parámetros pasados por el usuario, calculas el nombre de la nueva imagen a crear. Se supone entonces que aquí hay un truco: si un usuario llama a tu programa con los mismos parámetros, debería siempre ver la misma imagen. Si ese no es tu caso, entonces el paso siguiente lo saltas.
my $imagen = ... ;
5.- En caso de que esa imagen ya exista ( -e $imagen ) saltamos la generación de la imagen
6.- Generamos la imagen y la guardamos (ya estamos dentro de tmp/, por lo que la guardamos en el directorio actual)
my $img = new GD; ...
7.- Generamos la página html. Las referencias a la imagen serán: <img src="/tmp/imagenDGHFDSJ343JHH23.gif>
8.- Entregamos la página html al usuario. ( $|=1; print ... )
Lo ideal sería hacer el borrado de las imágenes viejas después de la entrega de la página, en caso de ser muchas, pero este es un trabajo que los ordenadores hacen de forma muy rápida y el usuario ni se enteraría.