В Perl, как и во всех нормальных языках программирования, существует возможность переопределения встроенных методов. Метод die убивает выполняющийся скрипт, что, в общем-то, является быстрым аварийных выходом из программы. Для переопределения этого метода есть два способа, одним из которых является установка своей функции-обработчика метода die в псевдо-переменную *CORE::GLOBAL::die : при каждом вызове die будет срабатывать именно твой метод. Чтобы из своего хэндлера позвать встроенную функцию, в данном случае нужно было бы написать CORE::die (это нужно, чтобы не прерывать цепочку событий, которая обязана произойти в этом случае), но если из *CORE::GLOBAL::die вызвать просто die, то снова сработает *CORE::GLOBAL::die , который снова вызовет die, а дальше — рекурсия. Таким образом программа будет бесконечно пытаться умереть, убивая саму себя.
Могут быть разные ситуации, когда это нужно, но уверен, что все они сводятся к отладке конечного продукта. В моём случае, перед тем, как на самом деле завершиться, программа записывает в базу данных сведения о том, в каком состоянии и в какой момент она умирает: сразу становится ярко видно, что же случилось. Алсо есть места, где предполагается избежать завершения программы при die, и в таких случаях этого события вообще не было бы видно, а так — мы увидим это на уютненькой страничке с логом ошибок, и сможем предпринять нужные действия. Алсо баяндекс утверждает, что у них тоже используется такой подход.
а что это значит?
В Perl, как и во всех нормальных языках программирования, существует возможность переопределения встроенных методов. Метод die убивает выполняющийся скрипт, что, в общем-то, является быстрым аварийных выходом из программы. Для переопределения этого метода есть два способа, одним из которых является установка своей функции-обработчика метода die в псевдо-переменную *CORE::GLOBAL::die : при каждом вызове die будет срабатывать именно твой метод. Чтобы из своего хэндлера позвать встроенную функцию, в данном случае нужно было бы написать CORE::die (это нужно, чтобы не прерывать цепочку событий, которая обязана произойти в этом случае), но если из *CORE::GLOBAL::die вызвать просто die, то снова сработает *CORE::GLOBAL::die , который снова вызовет die, а дальше — рекурсия. Таким образом программа будет бесконечно пытаться умереть, убивая саму себя.
О_О жуть какая, понятно только до второй запятой) А зачем переопределять метод?
Могут быть разные ситуации, когда это нужно, но уверен, что все они сводятся к отладке конечного продукта. В моём случае, перед тем, как на самом деле завершиться, программа записывает в базу данных сведения о том, в каком состоянии и в какой момент она умирает: сразу становится ярко видно, что же случилось. Алсо есть места, где предполагается избежать завершения программы при die, и в таких случаях этого события вообще не было бы видно, а так — мы увидим это на уютненькой страничке с логом ошибок, и сможем предпринять нужные действия. Алсо баяндекс утверждает, что у них тоже используется такой подход.
у меня не зацикливается
v5.10.1
Покажи сорцы.
$ cat shit.pl
*CORE::GLOBAL::die = sub{die @_ };
die;
$ perl shit.pl
Died at shit.pl line 2.
а cat это что?
Ацтой, у нас сегодня детёныш с mod_perl форкнулся и час висел, спамя в лог мессажки от die, пока его руками не пришибли.
ну я может что-то не так написал, я перл вообще не знаю.
Да нет, суть в том, что оно так и было, когда циклилось:
*CORE::GLOBAL::die = sub{
print STDERR &verbose_log( errdata => \@_,
sig => 'DIE' );
die @_;
};
Видимо это приблуды mod_perl.
Кошка.
в данном случае выводи содержимое файла.
а я думала, что кот :)
Усы есть у обоих. :)
=^_^=
(¯◡◡¯)