テンポラリファイルに書いてからrenameするのがいいんじゃない
たいていOS側でrename操作は排他的に処理してくれる

use File::Temp qw(tempfile);
my ($fh, $tempname) = tempfile(DIR=>'.');
$fh->print("hello world\n");
$fh->close();
rename $tempname, "real-file-name.txt"; #ここで競合が防がれる