This was previously discussed here. This is known as autovivification, and is documented in the documentation for exists, and in perlref. Yes, the only way to avoid this behavior of exists is to check the higher levels of the hash first.
Comment on Re: Why does perl expression in empty nested hash create parents