my @todos = $data; while (@todos) { my $todo = pop @todos; if (exists $todo->{data}) { for (my $x=0; $x < @{$todo->{data}}; $x++) { if ($todo->{data}[$x]{id} eq '2') { delete $todo->{data}[$x]; } else { push @todos, $todo->{data}[$x]; } } } }