sub unordered_sets { my ($in, $out, $left, $idx, $curr) = @_; push @$out, [@$curr] and return if $left == 0; $idx ||= 0; for ($idx .. $#$in) { push @$curr, $in->[$_]; unordered_sets($in, $out, $left-1, $_, $curr); pop @$curr; } } my @sets; unordered_sets [1..6], \@sets, 6;