my ($C,$R)=(4,3); #Columns,Rows my @list = qw(1 2 3 4 5 6 7 8 9 10 11 12); my @AoA=(); while (@list) { push(@AoA, [ splice(@list, 0, $C) ]); } pp \@AoA; pp \@list; [[1 .. 4], [5 .. 8], [9 .. 12]] []