use Algorithm::Loops 'MapCarMin'; %hash = MapCarMin {@_} [ 0 .. keys %hash ], [ @hash{ sort {$a<=>$b} keys %hash } ]; #### %hash = map { ref($_) && $_ == \$hash{''} ? ( delete $hash{''} )[1..0] : ( ++$hash{''}, $_ ) } @hash{ sort {$a<=>$b} keys %hash }, \$hash{''}; #### @hash{ 1..keys %hash } = delete @hash{ sort {$a<=>$b} keys %hash };