This thread seems fairly dead, but I can't believe nobody mentioned what is probably the most frequent use of BEGIN: calling CGI::Carp qw{ fatalsToBrowser } in a BEGIN allows compile-time errors to be sent to the browser, which is an incredibly useful feature for debugging. Otherwise, compile-time errors simply generate a 500 Internal Server Error, and debugging requires digging through the the logs.