sub numerically { $a <=> $b }; my @portsorted = sort numerically keys %ports; my @header; for (@portsorted) { my @portchars = split //, $_ . ' ' x (5 - length()); for ( 0 .. 4 ) { push @{$header[$_]}, $portchars[$_]; } } for (@header) { print "\t\t ", join('|',@{$_}), "\n"; } print "IPs\t\t ", '_|' x scalar(@portsorted), "\n"; __END__ outputs this (tabs notwithstanding): 2|8|1|1|4|4|9 2|0|1|3|4|4|3 | |1|9|3|5|8 | | | | | | | | | | | | IPs _|_|_|_|_|_|_|