use strict; use warnings; use List::MoreUtils qw(natatime); my $string = '1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ' . '2 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 ' . '3 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ' . '4 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 ' . '5 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 ' . '6 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 ' . '7 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 ' . '8 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 ' . '9 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 ' . '10 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 ' . '11 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 ' . '12 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 ' . '13 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0' ; my $template1 = 'A2' x 18; my $template10 = 'A3' . 'A2' x 17; my $it = natatime 18, unpack( $template1 x 9 . "($template10)".'*' , $string); while (my @vals = $it->()) { printf '%2d' x 18 . "\n", @vals } OUTPUT: 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 2 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 3 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 4 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 5 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 6 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 7 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 8 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 9 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 10 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 11 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 12 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 13 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0