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;