I think a good solution would be to sort the
terms that you're matching for and create a
regexp of the strings in sorted order. Sort
them so that the regexp tries to match the longest
string first, then moves on down in length until
it's trying to match the shortest one.
Something like the following should work:
my @terms = ('lymph', 'lymph node');
my @text = ('right lymph node', 'lymph fluid');
# create a regexp that will match the longest
# string first and capture the string that matched
my $words = '\b(' .
join('|',
sort { length $b <=> length $a } @terms) .
')\b';
for my $text (@text) {
if ($text =~ /$words/) {
print $text, ": matched => ", $1, "\n";
}
}