use Math::Combinatorics qw( combine); my @collection; # list of strings my @tuples = combine( 2, @collection); my @similarity = sort { similarity($a) <=> similarity($b) } @tuples; sub similarity { my $tupel = shift; my $value; ... # determine similarity # between $tupel->[0] and $tupel->[1] # and store into $value ... return $value; } #### my @similarity = map { $_->[0] } sort { $a->[1] <=> $b->[1] } map { [ $_, similarity($_) ] } @tuples;