# adjust $i after replacement so it is reexamined: for ( my $i = 0; $i < @AoH_all; ++$i ) { if ( $exclude{ $AoH_all[$i]{id} } ) { splice @AoH_all, $i, 1; --$i; } } # or, only increment $i if we didn't do a replacement: for ( my $i = 0; $i < @AoH_all; ) { if ( $exclude{ $AoH_all[$i]{id} } ) { splice @AoH_all, $i, 1; } else { ++$i; } }