in reply to Template Toolkit - passing hashes

Replace this:
$vars = { data => %data, today => $today };
$vars = { data => \%data, today => $today };
Otherwise perl will expand the %data hash into a list.

Another problem is that you are building a hash of hashes, but your template seems to expect a list of hashes.

You should always use both strict and warnings by the way.