use v5.10.0; use warnings; use strict; use Data::Dump qw/pp/; #my @sets = ( ["A".."C"], [("-") x 3] ); my (@path,@results); my %bag = ( A => 4, B => 2, C => 3, D => 1 ); my @sets = (); my $MODULO_ROTATION = 1; if ($MODULO_ROTATION ){ delete $bag{D}; push @path,"D"; } push @sets, [ ($_) x $bag{$_} ] for keys %bag; sub branch { my $done=1; for my $set (@sets){ if (@$set) { $done=0; push @path, shift @$set; branch(); unshift @$set, pop @path; } } if ($done){ push @results, join "",@path; } } branch(); pp \@results;