use strict; use warnings; use Time::HiRes qw[ time ]; # explicit enumeration my $s = time; my $string = "aabc"; my $n = length $string; my $p = 2**$n; for( my $i=0; $i<$p; $i++ ) { my $x = sprintf( "%0${n}b", $i ); print substr( $string, $_, 1 ), substr( $x, $_, 1) ? "1" : "" for 0..$n-1; print "\n"; } print STDERR "time: ", time-$s, "\n"; # using glob $s = time; my $g = ""; $g .= substr( $string, $_, 1 ).'{,1}' for 0..$n-1; print "$_\n" while( glob $g ); print STDERR "time: ", time-$s, "\n";