use strict; my %ipaddr = ( a => '192.168.0.1', b => '192.168.0.3', c => '192.168.0.200', d => '192.168.2.1', e => '192.168.100.1', f => '192.168.1.1', ); # The old method: # my @sortedKeys = sort {$ipaddr{$a} cmp $ipaddr{$b}} keys %ipaddr; my @sortedKeys = map {$_->[0]} sort {$a->[1] cmp $b->[1]} map {[$_, join '.', map {sprintf "%03d", $_} split '\.', $ipaddr{$_}]} keys %ipaddr; print "$ipaddr{$_}\t$_\n" for @sortedKeys;