Seems perhaps at bit overly complex to me. Here is modified version of my code:
#!/usr/bin/perl
use strict;
use warnings;
use Algorithm::Permute;
my $p = Algorithm::Permute->new(['a','b','c','d','e'], 3);
my @results;
while (my @res = $p->next)
{
push @results, [@res = sort @res]; # use a different sort for numbe
+rs
}
my %seen;
@results = map {!$seen{"@$_"}++? $_:() }@results; # remove duplicates!
print join ("+",@$_)."\n" for @results;
__END__
Prints: Again I sorted results in program editor
because actual program probably doesn't need
that feature.
a+b+c
a+b+d
a+b+e
a+c+d
a+c+e
a+d+e
b+c+d
b+c+e
b+d+e
c+d+e
The unsorted output for reference::
a+b+c
b+c+d
a+c+d
a+b+d
b+c+e
a+c+e
b+d+e
c+d+e
a+d+e
a+b+e
Now of course the code could be modified so that a duplicate is not inserted into the @results array to begin with. However, I would recommend this 2 step process because it is easier to debug.
Update: Improved Code, re suggestions from AnomalousMonk.
#!/usr/bin/perl
use strict;
use warnings;
use Algorithm::Permute;
my $p = Algorithm::Permute->new(['a','b','c','d','e'], 3);
my @results;
while (my @res = $p->next)
{
push @results, [sort @res]; # use a different sort for numbers
}
my %seen;
@results = grep{!$seen{"@$_"}++ }@results; # remove duplicates!
print join ("+",@$_)."\n" for @results;
|