my @sets; for my $x (1..3){ my @products = map { $x ** $_ } (1..3); push @sets, \@products; } use Data::Dumper; print Dumper(\@sets); #### my @sets = map { my $x = $_; # Copy outer loop variable my @products = map { $x ** $_ } (1..3); \@products; } (1..3); #### my @sets = map { my $x = $_; # Copy outer loop variable [map { $x ** $_ } (1..3)]; } (1..3);