Some other options to what has already been mentioned:
(s)printf. Old-school, but it's simple and it works.
Using a markup language (HTML, PoD, TeX, troff, etc) and feeding it to the appropriate formatting engine. Lots of helper packages in this space (Template::Toolkit, pod2*, etc)
creating PDF output directly (PDF::Create, PDF::Report, PDF::Report::Table).