use Fcntl qw(:DEFAULT :flock); my $path = "/path/to/data/"; my $pattern = "[0-9]" x 7; # Every program which creates a datfile here must honor dat.lock # take the lock before we read names my $pathlock = "${path}dat.lock"; open LOCK, "> $pathlock" or die $!; flock LOCK, LOCK_EX or die $!; my @lastfile = sort glob("${path}${pattern}.dat"); my ($nextnum) = $lastfile[-1] =~ /(\d{7})\.dat$/; $nextnum += 1; my $nextname = sprintf "%07d.dat", $nextnum; # answers question 2 open NEWDAT, "> ${path}${nextname}" or die $!; # ... close NEWDAT or die $!; close LOCK or die $!;