in reply to Should calling 'exists' create a hash key?

As I'm sure you have figured out already, if you want to avoid autovivication in this sort of operation, you can either use Data::Diver (as suggested by tye), or you can rearrange your conditionals:
if ( exists( $$x{fred} )) { print "fred defined\n"; print "dave defined\n" if ( exists( $$x{fred}{dave} )); }
Obviously, if you need to do this sort of thing a lot, with arbitrarily deep structures, using the module will make your coding a lot easier and cleaner.