Недавно обнаружил, что локализовывать переменную $@ в DESTROY методе бывает очень полезно. Даже, похоже, сабж можно поместить в мануал как best practice (или я невнимательно читал мануалы, и там такое уже есть?). Без лишних слов:
Программа выведет: Cow says: moo Cow can bark
Ну, наверное, вам уже стало понятно почему корова может гавкать?! Тут всё довольно просто и прозрачно. А вот диагностировать подобную проблему в сложной системе с кучей используемых модулей и фреймворков довольно сложно. На это можно убить даже не несколько часов, а несколько дней. Так что, рекомендую локализовывать $@ в DESTROY методе ваших классов.
По этой же причине значению, которое вернул eval, вообще нельзя доверять (ты же не контролируешь код всех модулей, которые используешь), и стоит использовать Try::Tiny или что-то подобное.
(с) этот текст - найденная на просторах интернета копипаста