in reply to -w in production environment

In addition to all the good answers already given:

You don't need two if statements. This is simpler:

if ($USER{coffee} && $USER{coffee} > 5){ $msg = 'You drink too much coffee' }
It's still redundant, but that's part of the point of using warnings. Warnings seem to make perl assume less about what you mean, so you need to tell it more about what you want. In my experience strict and warnings compliant code is always larger and slower than 'casual' freestyle perl code, but for large scripts the price is well worth what it buys in security and stability.

Update: Abigail makes a good point about sanity checking. For that perl needs more information about what we expect our input to contain:
if ($USER{coffee} && $USER{coffee} =~ /\d+/){ $msg = 'You drink too much coffee' if $USER{coffee} > 5; }

Check out my Perlmonks Related Scripts like framechat, reputer, and xNN.