use strict; my @list = (1,2,3); my @result = (); for my $elem (@list) { push @result, [ @$_, $elem ] for @{ [ @result ] }; push @result, [ $elem ]; } use Data::Dumper; print Dumper @result;