sub server_sort { # bi-valued key = 0 if {tag} is not 53 and 1 if {tag} is 53 (($my_server_hash{$a}{tag} == 53) <=> ($my_server_hash{$b}{tag} == 53)) || $a cmp $b || $my_server_hash{$a}{tag} <=> $my_server_hash{$b}{tag} } my @server_names = sort &server_sort keys %my_server_hash; # now the server names are sorted with the 53 tags grouped # separately from the rest. #### 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; #### sub make_key { my $sn = shift; my $tag = $my_server_hash{$sn}{tag}; my $member = $my_server_hash{$sn}{ADMINS}; my $key = ($tag == 53) ? 2 : (($member =~ s/$tag/FOUND:$tag/i) && $tag != 1) ? 1 : 0; return sprintf "%1d%20s%5d", $key, $sn, $tag}; }