Adesso e` un po' che non uso piu` Perl, ma mi pare che le hash non possano venir ordinate.
Puoi ordinare una matrice, ma non un hash.
Cioe`: l'ordine della hash e` una cosa interna al programma, ma su cui non puoi farci conto.
La hash serve per trovare un valore data la chiave.

Comunque prova a dare in ingresso piu` dati e con ordine diverso, e vedi poi se noti lo stesso problema (che tu hai attribuito all'ordinamento ASCII, ma che io non ritengo corretto).

Invece puoi ordinare un vettore.
Quindi dovresti prima copiare la hash in un vettore (nel tuo caso vettore di vettori, ovvero matrice a due indici) e poi ordinare il vettore esterno.
Inoltre se usi la funzione sort, e` sicuramente piu` performante, rispetto alla tua funzione di ordinamento.

PS: credo che ti convenga usare lo strict, e fare in modo che eventuali warning ti vengano segnalati: le variabili tu non le dichiari, e questo ti puo` anche portare a problemi "strani" di cui non riesci poi a capire la sorgente.