You cannot operate on a hash directly, because perl doesn't work that way. References are not pointers in the C sense. You cannot directly access memory.
Hashes and arrays might look similar on the surface - because you can cast between them with:
my @array = %hash;
%hash = @array;
And it 'works'. But this disguises that behind the scenes, they are different beasts. @array is still an ordered list of elements. %hash is still a non-deterministic ordered dictionary. The reason this work at all, is because enumerating a %hash in a list context, returns paired values. And you can populate a hash with a list of paired values.
Indeed, that's pretty much what;
my %hash = ( 'January' => 'Jan',
'February' => 'Feb');
Is actually doing. You're supplying a list to the hash, and it's doing the right thing with it - associating the 'key' with the 'value' as paired values. ( => is basically the same as a comma, but it's often used like this because it's clearer to show the key-value associations).
Here's an older article on how hashes work - it's changed somewhat in the intervening time, but the principle is similar - there are buckets, and hashes keys map into the buckets based on an internal algorithm.
When you enumerate the whole hash in a list context - it returns the key-value pairs in an effectively random order each time, because that's how it's 'working' behind the scenes with the hash-lookup mechanism.
But this means looking for a "real array ref" and "operating on a hash directly" isn't really meaningful - perl doesn't support doing that like you could in C, because that's not how the language works.
If you really want to know what's happening behind the scenes - perlguts will give you a lot of detail. But it's mostly irrelevant to the process of coding in perl.