Если вы хотите, чтобы XHTML был правильно сформирован, вам все равно нужно экранировать «<». Что, конечно, Javascript не понравится. </p>
Таким образом, решение состоит в том, чтобы поместить скрипт в раздел CDATA, который вы получаете в XML :: Twig, присваивая элементу тег '#CDATA
'
Вот как бы вы создали раздел CDATA:
perl -MXML::Twig -E'say XML::Twig::Elt->new( script)->set_cdata( "a<b")->sprint'
# <script><![CDATA[a<b]]></script>
Если вы хотите обернуть все скрипты в CDATA, вот как это сделать:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
XML::Twig->new( twig_roots => { script => sub { if( my $s= $_->text) { $_->set_cdata( $s); }
$_->print;
},
},
twig_print_outside_roots => 1,
)
->parsefile( $ARGV[0]);
Это обернет только локальные сценарии и не обернет дважды уже созданные.