Oh, right, I read an elsif instead of the second if, which meant that you would only have exited the loop when $position is above range. Then resetting $placeholder to 0 would work I guess (untested). But the condition is that your input data has to be sorted (as in ordered), which it seemed to be in your sample.
Still, you don't check that $placeholder is a valid value, if the last element of @SNP is inside one of the ranges, you'll increase $placeholder and try to access $SNP[last element+1] which would yield undef. I'm not sure you thought of that case.
In the end, your inner loop reworked would be something like :
# It would probably be better have
# while (my $line = <CG>)
# but that would mean rethinking your whole code
for my $line (@SNP)
my $position = (split " ", $line);
last unless $position <= $end;
print OUT $line if $position > $start;
This is of course, completely untested :D.