my @todos = map { { data => $_, level => 1 } } @{$data->{data}}; while (@todos) { my $todo = pop @todos; print "id: ", $todo->{data}{id}, "\n"; print "level: ", $todo->{level}, "\n"; if (exists $todo->{data}{data}) { push @todos, map { { data => $_, level => $todo->{level} +1 } } @{$todo->{data}{data}}; } }