use Algorithm::Loops qw< NestedLoops >; my $getList = NestedLoops( [ map [$_,''], 1..3 ] ); my $getStr = sub { join '', $getList->() }; my $subset; while( $subset = $getStr->() ) { print ' ', $subset; } print $/; # or, if you also want the empty subset: $getList = NestedLoops( [ map ['',$_], 1..3 ] ); $subset = $getStr->(); do { print " ($subset)"; } while( $subset = $getStr->() ); print $/; __END__ 123 12 13 1 23 2 3 () (3) (2) (23) (1) (13) (12) (123)