Contrary to what you said, Perl does NOT have the ability to compare things like arrays for equality as you claim. For starters, Perl has no definition for array equality. And if the definition requires comparing the contents of the array, then Perl doesn't have definitions of equality for most things that can be found in an array either.
The closest Perl has for a definition of equality arrays is their address. If that's what you want to use, then it's quite easy:
$key = ['a', 'b'];
$hash{$key} = [ $key, $val ]; # Prevents the key from being freed.
print $hash{$key}[1];
Otherwise, Perl leaves it up to you to implement what you want instead of forcing you to use what it provides. I see two main approaches.
A tied hash, basically code that presents the interface of a hash without actually being a hash table, can support any key type. You could use it to define your version of array equality. There might even be an existing module (although I didn't see one after a very quick search).
Another approach would be to create a function that produces a unique key from the key expression.
sub key{ "@_" } # Overly simplistic?
$hash{key('a', 'b')} = $val;
print $hash{key('a', 'b')};