Molto meglio fare il lavoro contrario, cioè consentire solo i caratteri ammessi, ad es:

die "Errore\n" if ($q->param('file') !~ /[a-zA-Z0-9_.-]+/ or $q->param('file') =~ /\.\./);

un punto lo devi ammettere per forza, ma devi escludere tutti gli altri caratteri che non hanno senso nel nome di un file: /\ ' " & $; eccetera.