sub printsubsets1 {
my ($prefix, @elemarray) = @_;
if (!@elemarray) {return;}
my $elem = shift @elemarray;
print "$prefix$elem\n";
printsubsets1 ("$prefix$elem", @elemarray);
printsubsets1 ("$prefix ", @elemarray);
}
sub printsubsets { printsubsets1("",@_);}
printsubsets(qw(a b c d e));
####
sub printsubsets2 {
my $stuff = join('',@_);
my $mask = "\xff" . ("\x00" x (length($stuff)-1));
do {
my $str = $mask & $stuff;
$str =~ y/\x00/ /;
print $str,"\n";
if ($mask =~ s/\xff\x00(\x00*)$/\xff\xff$1/) {}
elsif ($mask =~ s/\xff\x00(\x00*)\xff$/\x00\xff$1\x00/) {}
elsif ($mask =~ s/\xff{2}$/\x00\xff/) {}
else {return;}
} while (1);
}
printsubsets2(qw(a b c d e));
##
##
sub initialmask {
my $nelem = shift;
return "\xff" . ("\x00" x ($nelem-1));
}
sub nextmask {
if ($_[0] =~ s/\xff\x00(\x00*)$/\xff\xff$1/) {1;}
elsif ($_[0] =~ s/\xff\x00(\x00*)\xff$/\x00\xff$1\x00/) {1;}
elsif ($_[0] =~ s/\xff{2}$/\x00\xff/) {1;}
else {0;}
}
# later in your code:
my $mask = initialmask($nfactors);
do {
# blah blah blah $mask
} while (nextmask($mask));
##
##
--
@/=map{[/./g]}qw/.h_nJ Xapou cets krht ele_ r_ra/;
map{y/X_/\n /;print}map{pop@$_}@/for@/