how about just this:
%foo = (%foo, %bar);
the "(" cats the hashes in array context, making one long array with an even number of elements, then assigns that to a hash.
Of course this is memory intensive for large hashes. So this is really not very good after all. I must meditate some more in silence...

Perl is very wise. I have not tested, but I assume that in the case of %foo = (%foo, %bar); that the values of %bar that share keys with %foo will over write the value in the cat and the value in the new %foo will be from %bar?

Sorry that sentence was so long, I got caught up in the moment. I use this, not only to garuntee %bar will over write %foo, but so anyone who looks at the code after me will have no dougts as to what I was attempting: