The problem here is because the value of $n is dependant on user input. On line 27 you are writing to a file with no real idea of what that file could be. For example a malicious user can use slashes to form a path causing the file to be written to even a different directory than you had planned on. You will first have to assure that $n will not contain any unwanted input and then clear its taintedness.
A good way to prevent "bad characters" from appearing and still allow the user to type in a full range of characters is to convert the value of $n to a hex string. The character values are retained but the string will only contain the characters 0-9 and a-f.
$n = unpack('H*', $n);
Now that we know it is safe, we need to untaint $n so that Perl will allow it through. The only way to bypass the tainting mechanism is by referencing subpatterns from a regular expression match. Perl presumes that if you reference a substring using $1, $2, etc., that you knew what you were doing when you wrote the pattern.
$n =~ m/^(.*)$/s;
$n = $1;
Or you could use a regular expression match to only allow certain characters through.