У вас есть опечатка в коде, который вы опубликовали (второй аргумент open
), но это не объясняет сообщение об ошибке. Сообщение для этой проблемы будет следующим:
Unknown open() mode ',' at ...
Ваша проблема связана с приоритетом. ||
связывается слишком тесно, в результате чего Perl рассматривает все это выражение как третий аргумент для открытия:
$file || croak $!
В результате, даже если open
завершается ошибкой (вероятно, из-за того, что $file
не является допустимым именем файла), croak
не выполняется (потому что $file
имеет значение true и ||
короткое замыкание). После сбоя open
ваша программа пытается прочитать некоторые строки из неоткрытого дескриптора файла, и вы получите следующее сообщение об ошибке:
readline() on closed filehandle $fh at ...
Вы хотите использовать одно из следующих. Второй вариант работает (в отличие от вашего кода), поскольку or
имеет низкий приоритет.
open(my $fh, '<', $file) || croak ...;
open my $fh, '<', $file or croak ...;
Подробнее о приоритетах операторов см. perlop . Важным моментом в вашем случае является то, что оператор ||
имеет более высокий приоритет, чем разделитель списка (запятая).