I assume that source in the patterns are unique. This assumption comes from the fact that it they are not, then you end up doing only the first. If that assumption is correct, then I suggest you parse the patterns as hash instead of list, this would remove someamount of splits. Like this:
# assume REGEX is the pattern filehandle
# asseme INPUT is the your input filehandle
my %regex=();
while (<REGEX>) {
chomp;
my ($key,$value) = split (\t,$_);
$value = "\"$value\"";
$regex{$key}=$value;
}
while (<INPUT>) {
s/$key/$regex{$key}/gee foreach my $key (keys %regex);
}
This could also allow testing if there is an regex you want to use 'exists()' (depending on input, eg change only certain column within csv file or something). But since I don't know if input is suitable for this, i can't know if exists could be used. If it could, you might be able to drop the second foreach loop completely.