print map { "@$_\n" } allperms("a","b","c","d"); exit; sub allperms() { my @l = @_; my $n=$#l; return \@l if ($n<1); my @perms = (); for (my $i=0;$i<=$n;$i++) { my $c = $l[$i]; my @r = @l[0..($i-1),($i+1)..$n]; push @perms, map { [$c,@$_] } allperms(@r); } return @perms; }