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/