my @strs = qw/ ABCBXBCA APCBXBCAC /; my @patterns = (qr/B.B/, qr/CB/); # See comment below. my $matched_pattern; my $all_pats = do { use re 'eval'; qr/(.*?)(?:@{[join '|', map "$patterns[$_](?{\$matched_pattern = $_})", 0 .. $#patterns]})/; }; foreach (@strs) { print "String:$_ Pattern:$patterns[$matched_pattern] KeyWord:$1\n" if /$all_pats/; }