# untested! my %h = (...); my @k; while (keys %h) { my $k = each %h; push @k, $k; delete $h{$k}; } @k = sort @k; my $ix = 0; while (@k) { $h{shift @k} = $ix++; }