use Data::Dumper; use strict; use warnings; my @set = ('1', '2', '3', '4'); my $len = 3; #test shows that it is safe to specify len greater than set size, or equal to set size, or less than my @strings = generate($len, @set); print Dumper(\@strings); sub generate { my $len = shift; my @set = @_; my @strings; if ($#set == 0) { return ($set[0]); } else { if ($len == 1) { push @strings, "$_" foreach (@set); } else { for (0 .. $#set) { my @temp = @set; my $t = splice(@temp, $_, 1); push @strings, "$t$_" foreach (generate($len - 1, @temp)); } } return @strings; } }