my @todos = (); push @todos, { data => $_, level => 1 } for @{$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, { data => $_, level => $todo->{level} +1 } for @{$todo->{data}{data}}; } }