それなら、標準関数reverseを使ってみてはどうでしょうか。
%reversed_hash = reverse %hash;
で、キーと値を反転できます。ここでsortしてから、また反転して戻すとか。
あと蛇足ながら、ハッシュの値が数値でないなら比較するときはeqですよ。