Assuming well-formed data and sensible SQL then this should do the trick
use Data::Dumper;
## thanks Ovid :)
my @data = (
{season => 1, ep => 1, title => 'Hellmouth' },
{season => 1, ep => 2, title => 'Harvest' },
{season => 1, ep => 3, title => 'Witch' },
{season => 1, ep => 4, title => 'Teacher' },
{season => 1, ep => 5, title => 'First Date'},
{season => 2, ep => 13, title => 'Bad' },
{season => 2, ep => 14, title => 'Assembly' },
{season => 2, ep => 15, title => 'School' }
);
my $appearances = [];
for my $ref (@data) {
my $s = \$appearances->[ $ref->{season} - 1 ];
$$s->{season} = $ref->{season};
push @{ $$s->{ eps } },
{ title => $ref->{title} };
}
print Dumper $appearances;