in reply to Re: .= $err_msg
in thread .= $err_msg

That last loop just begs for trimming:

grep { not defined $$_ } values %params or die usage();

Well, maybe it's just me. But I really think that judicious grep usage is much clearer than equivalent for loops.

    -- Chip Salzenberg, Free-Floating Agent of Chaos