unlink() no genera ficheros, los borra.
En la línea 34 vuelves a cometer el mismo error de antes: estás usando comillas simples, con lo que impides la interpolación de la variable $filename.
En la línea 33, escribes CLOSE, pero en realidad es close (en minúsculas).
La línea 33 (el close()) debería estar puesta entre la 26 y la 27. De hecho, todas las instrucciones de las líneas 29 a 34 deberían estar metidas dentro del if() de la línea 20 (ejecutar todo el código si el usuario nos ha pasado un fichero y podemos leerlo).
Los ficheros temporales CGItemp es donde el módulo CGI guarda, temporalmente, el fichero que ha mandado el usuario, esperando que lo leamos con el bucle while() de la línea 24. Por defecto, CGI borrará el fichero, al final del programa (salvo que el programa termine con errores).
Esto puede parecer un poco raro: el módulo CGI graba el fichero subido por el usuario en un fichero temporal. Y luego nosotros lo leemos, escribiendo una copia a otro fichero, ya con nuestro nombre. Lo ideal, en muchos casos, es que pudiéramos procesar, directamente, el fichero temporal. Eso se consigue con la función
tmpFileName($file);. De esta manera, nos ahorramos todo el trabajo de open(), while() y close() (más información en la documentación de
CGI.pm, sección
PROCESSING A FILE UPLOAD FIELD).
Pero bueno, lo normal es hacerlo así, con una copia privada nuestra.