If you wish to use unpack, you need one template for lines 1-9 and another for lines 10-99.
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