in reply to Why doesn't this for loop work like I expect?

Looping over elements in an array and then changing the number of elements in that array can have unexpected results. Here's a quick fix:
while (@files) { my @bb; for (1 .. $num_cols) { my $file = shift @files || last; push @bb, $file; } push @data, \@bb; }
I chose while for this so that the loop will only continue while there are still elements in @files. I use the shift-or construct just in case the number of elements in @files is not a multiple of $num_cols. I push a reference onto @data because it's conceptually clearer to me (and it doesn't expand @bb into a list and then make that into an anonymous list).

splice is your best solution, though.