use Data::Dumper; my @fields = split /;/, $s; my @array; my $i = 0; for my $x (0..2) { for my $y (0..2) { for my $z (0..2) { $array[$x]->[$y]->[$z] = $fields[$i]; $i++; } } } print Dumper \@array;