my @strings_to_be_matched = ...; my ($ur) = map qr{ $_ }xms, join q{ | }, map quotemeta, reverse sort @strings_to_be_matched ; my $reg1 = qr/=/i; my $reg2 = qr/\S+=\S+/i; my $reg3 = qr/extern.+\b$ur\b\s*/i; my $reg4 = qr/;$/i; my $reg5 = qr/.+\b$ur\b\s*/i; foreach my $ln (@contents_of_file) { if ($ln =~ $reg3 and $ln =~ $reg4) { ... } if ($ln =~ $reg5 and $ln=~ $reg4 and ($ln !~ $reg1 or $ln =~ $reg2)) { ... } if ($ln =~ $reg3 and $ln !~ $reg4) { ... } if ($ln =~ $reg5 and $ln !~ $reg4 and $ln !~ $reg1) { ... } }