It seems to me that this would do what you are trying to accomplish.
while (<$in_file>) {
chomp;
if (/^SAMPLE/) {
my ( $placeholder, @coords ) = split /,/;
foreach my $coord (@coords) {
push @snp_bins, int( $coord / 100_000 );
}
}
else {
my ( $id, @snps ) = split /,/;
#need to check here that $#snps == $#snp_bins ?
foreach my $index ( 0 .. $#snp_bins ) {
push( @{ $data{$id}[ $snp_bins[$index] ] }, $snps[$index] );
}
}
}
Unless you need them elsewhere, I don't see a reason in your code snippent to store @individuals and @all_snps. The "need to check" comment above is based on my attempt to understand your last statement above. If it's possible that @snps might not have an entry for each @snp_bins, then you'll want this check.