use Data::Dumper; my $parent = { div => [ { class => 'A', content => '1' }, { class => 'A', content => '2' }, { class => 'A', content => '3' }, { class => 'B', content => '4' }, { class => 'B', content => '5' }, { class => 'B', content => '6' }, ], }; my $grouped = {}; for ( @{ $parent->{div} } ) { my $class = delete $_->{class}; push @{ $grouped->{$class} }, $_; } $parent->{div} = $grouped; print(Dumper($parent));