use Data::Dumper; use strict; use warnings; my @set = ('1', '2', '3'); my @strings = generate(@set); print Dumper(\@strings); sub generate { my @set = @_; my @strings; if ($#set == 0) { return ($set[0]); } else { for (0 .. $#set) { my @temp = @set; my $t = splice(@temp, $_, 1); push @strings, "$t$_" foreach (generate(@temp)); } return @strings; } }