Also praktisch muss ich den json-codierten String selber beabeiten.
In Deinem Fall ja.
Da stellt sich dann doch die Frage, welchen speziellen Vorteil ein Template hier hat.
Und hier ist die Antwort: Das Eine hat mit dem Anderen nichts zu tun. Weder ein ESCAPE=HTML noch ein ESCAPE=JS wird Dein JSON Konstrukt sicher machen. Tipp: Guck Dir quotemeta() an.
MfG
PS; Einfaches Beispiel:
use HTML::Template;
use JSON;
my $template = q(var = %umgebung%;);
my $te = HTML::Template->new(
scalarref => \$template,
vanguard_compatibility_mode => 1,
);
$te->param( umgebung => encode_json(\%ENV) );
print $te->output;