my @typeset = ('P', 'K', 'L', 'G'); my $length = 10; my @lchain = (); strangemultiset($length, \@typeset, \@lchain); exit 0; sub strangemultiset { my $len=$_[0]; my @types=@{$_[1]}; my @chain=@{$_[2]}; my $ltype=shift(@types); my $var=$len - scalar(@chain) - scalar(@types); for(my $iter=1; $iter<=$var; ++$iter) { push(@chain, $ltype); if (scalar(@types) == 0) { if (scalar(@chain) == $len) { # we have a valid set, print it. print join('.', @chain), "\n"; } } else { strangemultiset($len, \@types, \@chain); } } }