Is there a reason you are using the
/(??{ })/ code block other than just to make a more general solution? This seems to work just fine.
#!/usr/bin/perl
use strict;
use warnings;
my $tag = '(?:<[^>]*>)';
while (<DATA>) {
s/($tag*tacos)/yummy $1/g;
s/($tag*salad)/green $1/g;
print;
}
__DATA__
I like tacos.
<5b>I <5c>like <5d>tacos.
I like a salad.
<foo>I <foo>like <foo>a <bar><baz><foo>salad.
<foo>I <foo>like <foo>a <bar><baz><foo>salad <bup>with <bobob>tacos.
I like yummy tacos.
<5b>I <5c>like yummy <5d>tacos.
I like a green salad.
<foo>I <foo>like <foo>a green <bar><baz><foo>salad.
<foo>I <foo>like <foo>a green <bar><baz><foo>salad <bup>with yummy <bo
+bob>tacos.