my @outer; while (my $rows1 = $query1->fetchrow_hashref()) { my $query2 = &db_query("SELECT title FROM pages WHERE sectionid = $sectionid"); $inner=[]; # you need a NEW array for each loop, not just an empty array while (my $rows2 = $query2->fetchrow_hashref()) { push(@$inner,{TITLE=>$rows2->{title}); } push(@outer,{ TITLE=>$rows1->{title}, PAGES=>$inner; }); } $template->param(sections=>\@outer);