Demo code, please. Your description is inaccurate (file handles don't have file names), and I can't reproduce the problem by guessing what you meant.
$ perl -Te'
my $fn = $ARGV[0];
($fn) = $fn =~ /^([a-zA-Z0-9]{1,8}\.txt)\z/ or die;
open(my $fh, ">", $fn) or die;
printf $fh "%s\n", "foo";
' foo.txt
$ cat foo.txt
foo
Update: Oops, missed the bit about writing tainted info, but it makes no difference
$ perl -Te'
my $fn = $ARGV[0];
($fn) = $fn =~ /^([a-zA-Z0-9]{1,8}\.txt)\z/
or die;
open(my $fh, ">", $fn) or die;
printf $fh "%s\n", $ARGV[0];
' foo.txt
$ cat foo.txt
foo.txt
$ perl -Te'
my $fn = $ARGV[0];
($fn) = $fn =~ /^([a-zA-Z0-9]{1,8}\.txt)\z/
or die;
open(my $fh, ">", $fn) or die;
print $fh $ARGV[0];
print $fh "\n";
' foo.txt
$ cat foo.txt
foo.txt
|