exists might be preferable to definded if you want to distinguish the case of routine( do_this => undef ).
OP -- There was also a very closely related discussion yesterday/this morning in the Hashes and keys... thread.
Comment on Re^2: Best method of assigning "default" values?