Вышеупомянутым use
вы лишаете Perl-анализатор знаний, которые O_RDONLY
et al. подпрограммы без параметров. Вы должны быть немного более многословным в этой ситуации:
sysopen(LF, "test.txt", O_RDONLY() | O_CREAT()) or die "SYSOPEN FAIL: $!";
if(flock(LF, LOCK_EX())) { print "SUCCESS.\n"; }
РЕДАКТИРОВАТЬ: Чтобы уточнить, без скобок, O_RDONLY
и O_CREAT
интерпретировались как голые слова (строки), которые ведут себя не так, как вы ожидаете, когда двоичные или объединены:
$ perl -le 'print O_RDONLY | O_CREAT'
O_SVOO\Y
(Отдельные символы поразрядны или объединены).
В этом случае строка «O_SVOO \ Y» (или что-то еще в вашей системе) интерпретировалась как число от 0 до sysopen
, что, следовательно, будет работать до тех пор, пока O_RDONLY
равно 0 (как это типично) и файл уже существовал (поэтому O_CREAT
был лишним). Но fcntl
явно не так простителен с нечисловыми аргументами:
$ perl -e 'flock STDOUT, "LOCK_EX" or die "Failed: $!"'
Failed: Bad file descriptor at -e line 1.
Аналогично:
$ perl -e 'flock STDOUT, LOCK_EX or die "Failed: $!"'
Failed: Bad file descriptor at -e line 1.
Тем не менее:
$ perl -e 'use Fcntl qw(:flock); flock STDOUT, LOCK_EX or die "Failed: $!"'
(no output)
Наконец, обратите внимание, что use strict
предоставляет много полезных подсказок.