use Data::Dumper; my $in = '0 X X X X X X X' . ' X 1 X X X X X X' . ' X X 2 X X X X X' . ' X X X 3 X X X X' . ' X X X X 4 X X X' . ' X X X X X 5 X X' . ' X X X X X X 6 X' . ' X X X X X X X 7'; print Dumper [ string2matrix( $in, 8 ) ]; sub string2matrix { my ( $string, $width ) = @_; my @out; while ( $string ) { my @iter = split /\s+/, $string, $width + 1; $string = scalar @iter > $width ? pop @iter : ''; push @out, \@iter; } return @out; }