How do I make a temporary file name?

Use the process ID and/or the current time-value. If you need to have many temporary files in one process, use a counter:

    BEGIN {
	use IO::File;
	use Fcntl;
	my $temp_dir = -d '/tmp' ? '/tmp' : $ENV{TMP} || $ENV{TEMP};
	my $base_name = sprintf("%s/%d-%d-0000", $temp_dir, $$, time());
	sub temp_file {
	    my $fh = undef;
	    my $count = 0;
	    until (defined($fh) || $count > 100) {
		$base_name =~ s/-(\d+)$/"-" . (1 + $1)/e;
		$fh = IO::File->new($base_name, O_WRONLY|O_EXCL|O_CREAT, 0644)
	    }
	    if (defined($fh)) {
		return ($fh, $base_name);
	    } else {
		return ();
	    }
	}
    }

Or you could simply use IO::Handle::new_tmpfile.