On Sun, 2008-10-05 at 15:29 -0500, Ryan wrote:
> my %data = (
> k1 => 'a',
> k2 => ['b', 'c'],
> k3 => ['d', 'e', 'f']
> k4 => 'a'
> );
>
> I want to get all the possible combinations:
>
> k1 => a
> k2 => b
> k3 => d
> k4 => a
>
> k1 => a
> k2 => c
> k3 => d
> k4 => a
>
> k1 => a
> k2 => b
> k3 => e
> k4 => a
>
> k1 => a
> k2 => c
> k3 => e
> k4 => a
>
> k1 => a
> k2 => b
> k3 => f
> k4 => a
>
> k1 => a
> k2 => c
> k3 => f
> k4 => a
>
> On a larger list ( 20 items) what's a good way to do this? My head is
> just kind of stuck on this...
>
Well, it ain't pretty but it works:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
$Data::Dumper::Sortkeys = 1;
$Data::Dumper::Indent = 1;
$Data::Dumper::Maxdepth = 0;
my %data = (
k1 => 'a',
k2 => ['b', 'c'],
k3 => ['d', 'e', 'f'],
k4 => 'a'
);
my @combos = combos( %data );
print Dumper [EMAIL PROTECTED];
sub combos {
my %data = @_;
my @keys = sort keys %data;
return _combos( [EMAIL PROTECTED], %data );
}
sub _combos {
my $keys = shift @_;
my %data = @_;
my @combos = ();
return () unless @$keys;
my $key = shift @$keys;
my $value = $data{$key};
delete $data{$key};
$value = [ $value ] unless ref( $value );
if( @$keys == 0 ){
for my $v ( @$value ){
push @combos, { $key => $v };
}
return @combos;
}
my @_combos = _combos( $keys, %data );
for my $v ( @$value ){
for my $_combo ( @_combos ){
push @combos, { $key=>$v, %$_combo };
}
}
return @combos;
}
__END__
--
Just my 0.00000002 million dollars worth,
Shawn
Linux is obsolete.
-- Andrew Tanenbaum
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/