use Algorithm::Loops 'NestedLoops'; use Data::Dumper; sub init_arr { my ($val, @dims) = @_; my $arr; NestedLoops( [map [0..$_-1], @dims], sub {my $r = \$arr; map {$r=\(($$r)->[$_])} @_; $$r=$val} ); $arr; } print Dumper (init_arr('hi',3,2,1));