for my $line( map { $_->[2] } sort { $a->[0] cmp $b->[0] || $a->[1] <=> $b->[1] } map { my @vals = split /\s/, $_; my( $sourceserv, $sourceport ) = (split /:/, $vals[0])[0,1]; my( $destserv, $destport ) = (split /:/, $vals[2])[0,1]; my( $low, $high ) = sort { $a cmp $b } ( "$sourceserv:$sourceport", "$destserv:$destport" ); my( $key ) = $low . '-' . $high; [ $key, $sourceport , $_ ] } ){ print $line; }