Ich rate einfach mal: HTML::Template ist für diese Art Template nicht gerüstet.
So ein Unsinn! Überlege Dir besser was Du an encode_json() übergibst. Wo ein Kontextwechsel erfolgt, daß musst Du schon selbst beachten, siehe hier, da gibt es ungezählte Möglichkeiten.
Wenn das eine TE nicht kann, heißt das doch noch lange nicht, daß sie dafür ungeeignet ist!
Im Übrigen ist HTML::Template dafür geeignet, JS zu escapen.
MfG
Tipp: HTML::Template kann auch %platzhalter%.