Конфигурирование perl, чтобы быть более строгим с ошибками ввода-вывода файла - PullRequest
1 голос
/ 08 ноября 2010

У меня есть Perl-скрипт со строкой, подобной следующей

my $in = new IO::File ($fn)
    or warn "Sorry, there was a problem opening $fn: $!\n",
    and return;

В моей системе, если путь к файлу, указанный в $fn, не существует, он отображает предупреждение и возвращает функцию.

Одна из некоторых систем, однако, печатает стандарт could not open {file path}: No such file or directory и выходит из сценария, а не выводит предупреждение, которое я поддерживал и возвращал.

Я изменил код для большей защиты,проверка, существует ли файл перед его открытием.Однако было бы полезно узнать, почему возникла такая разница, чтобы я мог в будущем правильно тестировать свой код, не выпуская и не ожидая отчетов об ошибках.

Существует ли какая-либо конфигурация для perl, которая делает его более строгим,возникают ошибки, такие как несуществующие файлы?

1 Ответ

2 голосов
/ 08 ноября 2010

Поскольку предупреждение не распечатывается, оно должно быть die раньше.Perl обычно не умирает с ошибками ввода-вывода, если вы не используете такой модуль, как Fatal (теперь не рекомендуется в качестве интерфейса) или autodie (предпочтительный интерфейс).

Итак, вы можете посмотреть на включение модулей autodie или Fatal в текущее время выполнения:

say "Fatal included from : $INC{'Fatal.pm'}";

Примечание: предпочтительный autodie включает Fatal, поэтому одна проверкадля любого из них.

Конечно, один из более полных способов выяснить, что он делает, это использовать

perl -d /path/to/io_script_dying_on_me.pl

и пройти через IO :: File :: newвызов - однако, некоторые модули Perl действуют по-разному при обнаружении отладчика .


Если бы он напечатал ваше сообщение, кто-то мог бы отменить предупреждение о том, что warn умретна предупреждения.Это можно сделать, изменив обработчик предупреждений ($SIG{__WARN__}) или установив другое определение в пространство имен CORE::GLOBAL.Вы можете проверить это с помощью следующего:

use Data::Dumper;
$Data::Dumper::Deparse = 1;

say Data::Dumper->Dump( [ $SIG{__WARN__} ], [ '$SIG{__WARN__}' ] );
say Data::Dumper->Dump( [ \&CORE::GLOBAL::warn ], [ '*CORE::GLOBAL::warn' ] );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...