How can I generate all permutations of an array in Perl? How can I generate all permutations of an array in Perl? arrays arrays

How can I generate all permutations of an array in Perl?


I suggest you use List::Permutor:

use List::Permutor;my $permutor = List::Permutor->new( 0, 1, 2);while ( my @permutation = $permutor->next() ) {    print "@permutation\n";}


From perlfaq4: "How do I permute N elements of a list?":


Use the List::Permutor module on CPAN. If the list is actually an array, try the Algorithm::Permute module (also on CPAN). It's written in XS code and is very efficient:

use Algorithm::Permute;my @array = 'a'..'d';my $p_iterator = Algorithm::Permute->new ( \@array );while (my @perm = $p_iterator->next) {   print "next permutation: (@perm)\n";}

For even faster execution, you could do:

use Algorithm::Permute;my @array = 'a'..'d';Algorithm::Permute::permute {    print "next permutation: (@array)\n";} @array;

Here's a little program that generates all permutations of all the words on each line of input. The algorithm embodied in the permute() function is discussed in Volume 4 (still unpublished) of Knuth's The Art of Computer Programming and will work on any list:

#!/usr/bin/perl -n# Fischer-Krause ordered permutation generatorsub permute (&@) {    my $code = shift;    my @idx = 0..$#_;    while ( $code->(@_[@idx]) ) {        my $p = $#idx;        --$p while $idx[$p-1] > $idx[$p];        my $q = $p or return;        push @idx, reverse splice @idx, $p;        ++$q while $idx[$p-1] > $idx[$q];        @idx[$p-1,$q]=@idx[$q,$p-1];    }}permute { print "@_\n" } split;

The Algorithm::Loops module also provides the NextPermute and NextPermuteNum functions which efficiently find all unique permutations of an array, even if it contains duplicate values, modifying it in-place: if its elements are in reverse-sorted order then the array is reversed, making it sorted, and it returns false; otherwise the next permutation is returned.

NextPermute uses string order and NextPermuteNum numeric order, so you can enumerate all the permutations of 0..9 like this:

use Algorithm::Loops qw(NextPermuteNum);my @list= 0..9;do { print "@list\n" } while NextPermuteNum @list;


You could use Algorithm::Permute and maybe Iterating Over Permutations (The Perl Journal, Fall 1998) is an interesting read for you.