Я знаю, что они все делают, но никогда не оказывался в ситуации, когда я нуждался в любом из них. Во многих случаях я использовал блоки BEGIN и END. BEGIN особенно полезен, когда вам нужно настроить среду до запуска кода, и я использовал END в некоторых ситуациях отладки, чтобы улавливать важную информацию о состоянии для неуправляемых ошибок с жестким треком.
Вы когда-нибудь использовали CHECK, UNITCHECK или INIT? Если да, зачем? А по какой-то причине блок BEGIN не хватило бы?
Документация для блоков находится на PerlDoc.