What's wrong with File::Temp? It's a core module, and it cleans up after itself pretty reliably:
use File::Temp qw/tempfile/;
my ($tfh,$tfn) = tempfile(UNLINK=>1);
print $tfh $contents;
close $tfh;
# File named $tfn will exist till end of program
And if you want to control the filename, you can do something like tempfile( TMPDIR=>1, TEMPLATE=>'.something_XXXXXXXXXX', SUFFIX => '.html', UNLINK=>1 ), or if you wanted to create the file in the same directory and based on the same name as some other file (File::Basename is also a core module):
use File::Basename qw/fileparse/;
use File::Temp qw/tempfile/;
my ($fn,$dir,$ext) = fileparse($filename, qr/\.[^.]+$/);
my ($tfh,$tfn) = tempfile(DIR=>$dir, TEMPLATE=>'.'.$fn.'_XXXXXXXXXX',
SUFFIX => $ext, UNLINK=>1 );
...
I also like to use something like Corion's Text::CleanFragment on the above $fn, but that's not necessarily required.
Update: Since I'm already dumping some File::Temp snippets, here's two more that use a temporary directory instead, allowing you to keep the original file name. File::Spec is also a core module. tempdir supports the same TEMPLATE, DIR, and TMPDIR arguments as above. Note that if you use only TEMPLATE with a relative name, the resulting filename will also be relative to the current working directory, which is IMO not good, so I'd strongly recommend using an additional TMPDIR=>1 or DIR argument.
use File::Temp qw/tempdir/;
use File::Basename qw/fileparse/;
use File::Spec::Functions qw/catfile/;
my $tmpdir = tempdir(CLEANUP=>1);
my $tfn = catfile($tmpdir, scalar fileparse($filename));
...
# - OR -
my ($fn,$dir) = fileparse($filename);
my $tmpdir = tempdir(DIR=>$dir, TEMPLATE=>'.XXXXXXXXXX', CLEANUP=>1 );
my $tfn = catfile($tmpdir, $fn);
...
|