sub make_key { my $sn = shift; my $tag = $my_server_hash{$sn}{tag}; # NOTE: presumes largest server name may be contained # in 20 chars and that {tag} values won't exceed 99,999 return sprintf "%1d%20s%5d", ($tag == 53), $sn, $tag}; } sub decode_key { my $key = shift; return substr $key, 1, 20; } my @server_names = map { decode_key($_) } sort { $a cmp $b } map { make_key($_) } keys %my_server_hash;