http://qs1969.pair.com?node_id=484593

bioMan has asked for the wisdom of the Perl Monks concerning the following question:

I need to iterate over all the members of an array to search for the longest matching substrings between the members of the array without looking for matches between any array element and itself. Initially I used nested for loops, but because of the length of my strings (3k characters), and the number of elements (300) leads to prohibitive times for my search. It took a week just to check one element of the array against every other element.

I decided to see if grep and map could yield a better solution. My best attempt is below.

@array = (3..9, 9, 7, 65, 4); $min = 1; # in my final program this will be 200 map {for $line($_+1..$#array){print ("\n$_\t$line\t", grep /(.{$min,}) +.*\1/, $array[$_].$array[$line])}} (0..$#array-1);

It gives me the index of the array elements containing the matches and the concatenated string containing the match. My original program gave me $1, but I can't see how to do that with the code above. Also this code returns the indices for pairs of array elements that do not contain a match (I'd love for them to disappear). Is there a better way to do this? I really don't want to have to learn C.

I realize no solution will be particularly fast, but a complete search in two weeks or less wouldn't bother me.

bioMan