Standard practice is to put your key/values into a hash and loop through your text once.
my %hash = (
vars => 'vars',
this => 'this',
doink => 'doink',
dink => 'dink',
);
while(<DATA>) {
s/\[([^]]+)\]/$hash{$1}/g;
print;
}
__END__
<h1>Some beginning HTML up here</h1>
<update>
interpolate [vars] when they
are<p> between brackets like [this].
<p> <a href="[doink]">[dink]</a>
</update>
<small>The ending HTML down here</small>
If you want, you can use HTML::Parser or something so it only looks at whatever's between the <update> tags (or, if as gryphon surmised, you want to run through <update> many times.)