FAQ 4.51 How do I permute N elements of a list?

Do you have a question? Post it now! No Registration Necessary.  Now with pictures!

Threaded View
This is an excerpt from the latest version perlfaq4.pod, which
comes with the standard Perl distribution. These postings aim to
reduce the number of repeated questions as well as allow the community
to review and update the answers. The latest version of the complete
perlfaq is at http://faq.perl.org .


4.51: 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-Kause ordered permutation generator

            sub 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];

            permute split;


The perlfaq-workers, a group of volunteers, maintain the perlfaq. They
are not necessarily experts in every domain where Perl might show up,
so please include as much information as possible and relevant in any
corrections. The perlfaq-workers also don't have access to every
operating system or platform, so please include relevant details for
corrections to examples that do not work on particular platforms.
Working code is greatly appreciated.

If you'd like to help maintain the perlfaq, see the details in

Posted via a free Usenet account from http://www.teranews.com

Re: FAQ 4.51 How do I permute N elements of a list?

Quoted text here. Click to load it

Just out of curiosity, does anyone know if he will ever publish the rest
of the volumes? I found the first 3 in the bargain bin of a used book
store for a dime each! Just about fell over.

Amer Neely
w: www.softouch.on.ca/
Perl | MySQL programming for all data entry forms.
"We make web sites work!"

Site Timeline