kainwinterheart 12.08.2011 18:31 samael6EE1130B

Бесконечная смерть: *CORE::GLOBAL::die = sub{ die @_ };

1. Fallen_September 12.08.2011 18:52

а что это значит?

2. kainwinterheartFallen_September /1 12.08.2011 18:58 samael6EE1130B

В Perl, как и во всех нормальных языках программирования, существует возможность переопределения встроенных методов. Метод die убивает выполняющийся скрипт, что, в общем-то, является быстрым аварийных выходом из программы. Для переопределения этого метода есть два способа, одним из которых является установка своей функции-обработчика метода die в псевдо-переменную *CORE::GLOBAL::die : при каждом вызове die будет срабатывать именно твой метод. Чтобы из своего хэндлера позвать встроенную функцию, в данном случае нужно было бы написать CORE::die (это нужно, чтобы не прерывать цепочку событий, которая обязана произойти в этом случае), но если из *CORE::GLOBAL::die вызвать просто die, то снова сработает *CORE::GLOBAL::die , который снова вызовет die, а дальше — рекурсия. Таким образом программа будет бесконечно пытаться умереть, убивая саму себя.

3. Fallen_Septemberkainwinterheart /2 12.08.2011 19:14

О_О жуть какая, понятно только до второй запятой) А зачем переопределять метод?

4. kainwinterheartFallen_September /3 12.08.2011 19:19 samael6EE1130B

Могут быть разные ситуации, когда это нужно, но уверен, что все они сводятся к отладке конечного продукта. В моём случае, перед тем, как на самом деле завершиться, программа записывает в базу данных сведения о том, в каком состоянии и в какой момент она умирает: сразу становится ярко видно, что же случилось. Алсо есть места, где предполагается избежать завершения программы при die, и в таких случаях этого события вообще не было бы видно, а так — мы увидим это на уютненькой страничке с логом ошибок, и сможем предпринять нужные действия. Алсо баяндекс утверждает, что у них тоже используется такой подход.

5. rtsomekainwinterheart /2 12.08.2011 19:28

у меня не зацикливается
v5.10.1

6. kainwinterheartrtsome /5 12.08.2011 19:29 samael6EE1130B

Покажи сорцы.

7. rtsomekainwinterheart /6 12.08.2011 19:32 tzeench

$ cat shit.pl
*CORE::GLOBAL::die = sub{die @_ };
die;
$ perl shit.pl
Died at shit.pl line 2.

8. Fallen_Septemberrtsome /7 12.08.2011 19:34

а cat это что?

9. kainwinterheartrtsome /7 12.08.2011 19:35 samael6EE1130B

Ацтой, у нас сегодня детёныш с mod_perl форкнулся и час висел, спамя в лог мессажки от die, пока его руками не пришибли.

10. rtsomekainwinterheart /9 12.08.2011 19:38 tzeench

ну я может что-то не так написал, я перл вообще не знаю.

11. kainwinterheartrtsome /10 12.08.2011 19:39 samael6EE1130B

Да нет, суть в том, что оно так и было, когда циклилось:

*CORE::GLOBAL::die = sub{
print STDERR &verbose_log( errdata => \@_,
sig => 'DIE' );
die @_;
};

Видимо это приблуды mod_perl.

12. kainwinterheartFallen_September /8 12.08.2011 19:39 samael6EE1130B

Кошка.

13. rtsomeFallen_September /8 12.08.2011 19:41 tzeench

в данном случае выводи содержимое файла.

14. Fallen_Septemberkainwinterheart /12 12.08.2011 19:47

а я думала, что кот :)

15. kainwinterheartFallen_September /14 12.08.2011 19:47 samael6EE1130B

Усы есть у обоих. :)

16. Fallen_Septemberkainwinterheart /15 12.08.2011 19:50

=^_^=

17. kainwinterheartFallen_September /16 12.08.2011 19:52 samael6EE1130B

(¯◡◡¯)

Do you really want to delete ?