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/


Reply via email to