use Fcntl qw(O_CREAT O_EXCL O_WRONLY); my $i; while(1) { my $dest = compose_name($base, $ext, $i++); if(sysopen my $fh, $dest, O_CREAT | O_EXCL | O_WRONLY) { close $fh; copy $source, $dest; last; } }