Here's an approach that reduces the number of file-opening calls
you need to manage --- determine what flags you want on the file
handle and use sysopen once. In the following modes 1 and 2 act
like > and >> respectively, else the file is
opened read-only. This can be altered --- if you'd rather fail on
attempting to append to a non-existing file, remove the O_CREAT flag
from mode 2 for example.
use Fcntl qw(:DEFAULT :flock);
# assume $flock_enabled set accordingly
sub safe_open {
my $fn = shift;
$fn =~ s/^(>>?)//;
$mode = length($1);
my $flags = $mode == 1 ? O_CREAT | O_WRONLY | O_TRUNC :
$mode == 2 ? O_CREAT | O_WRONLY | O_APPEND :
O_RDONLY;
sysopen(my $fh, $fn, $flags) || die "Can't open $fn: $!";
flock($fh, LOCK_EX) || die "Can't flock $fn: $!" if $flock_enabled
+;
return $fh;
}