for my $s (@search) { my @names = split ' ', $s; # this reqires at least first two names to match my @matches = grep { /^\Q$names[0]\E\s+\Q$names[1]\E\b/ } @source; @matches = sort {length($b)<=>length($a)} @matches; print "search='$s'\n"; print "\tfound='$_'\n" for @matches; } __END__ search='John Ronald Reuel T' found='John Ronald Reuel Tolkien' found='John Ronald S Tolkien' search='Trent Reznor' found='Trent Reznor' search='Barack Hussein II' found='Barack Hussein Obama II' found='Barack Hussein II' search='Barack Hussein Obama II' found='Barack Hussein Obama II' found='Barack Hussein II' search='No match here'