sub recurse { my ($ref, $car, @cdr) = @_; if ($prev_car eq $car) { my $hash = { name => $car, children => [] }; push @$ref, $hash; return unless @cdr; $prev_car = $car; recurse($hash->{children}, @cdr); } push @$ref, { name => $car, children => [] }; return unless @cdr; $prev_car = $car; recurse($ref, @cdr); } #### $VAR1 = [ { 'name' => 'one', 'children' => [] }, { 'name' => 'foo', 'children' => [] }, { 'name' => 'bar', 'children' => [] }, { 'name' => 'foo', 'children' => [ { 'name' => 'baz', 'children' => [] } ] }, { 'name' => 'foo', 'children' => [] }, { 'name' => 'baz', 'children' => [] }, { 'name' => 'foo', 'children' => [ { 'name' => 'qux', 'children' => [] }, { 'name' => 'two', 'children' => [] } ] }, { 'name' => 'foo', 'children' => [] }, { 'name' => 'qux', 'children' => [] }, { 'name' => 'two', 'children' => [] }, { 'name' => 'foo', 'children' => [] }, { 'name' => 'qux', 'children' => [] }, { 'name' => 'three', 'children' => [] }, { 'name' => 'foo', 'children' => [] }, { 'name' => 'qux', 'children' => [] }, { 'name' => 'four', 'children' => [] }, { 'name' => 'five', 'children' => [] } ];