##
use DBI;
use CGI qw(header);
use Template;
my $dbh = DBI->connect( ... );
my $students = $dbh->selectall_arrayref('
SELECT firstname,lastname,login,email FROM student
',{Slice => {}});
print header;
my $tt = Template->new;
$tt->process(\*DATA, {students => $students}) || die $tt->error();
__DATA__
Name Login Email
[% FOREACH student = students %]
[% student.lastname %], [% student.firstname %]
[% student.login %]
[% student.email %]
[% END %]
####
use DBIx::XHTML_Table;
use CGI qw(header);
print header, DBIx::XHTML_Table
->new(qw(DBI:vendor:database:host user pass))
->exec_query('SELECT firstname,lastname,login,email FROM student')
->map_cell(sub {my$e=shift;qq|$e|},'email')
->output
;