use Algorithm::Loops qw( NestedLoops ); sub comb { my @rv; NestedLoops(\@_, sub { push(@rv, [ @_ ]); }); return \@rv; }