use POSIX; my ($tmpfh, $name); do { $name = POSIX::tmpnam() } until sysopen( $tmpfh, $name, O_RDWR|O_CREAT|O_EXCL) or # if error, then $! !~ m/File exists/ # try again if bad name && die $!; # else die