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; }