use Algorithm::Loops qw( NestedLoops ); my $num_objects = 5; my $num_containers = 3; my $str = join('', 1..$num_objects); NestedLoops( [ [ 1 .. $num_objects-1 ], (sub { [ $_[-1]+1 .. $num_objects-1 ] }) x ($num_containers-2) ], sub { my $str = $str; substr($str, $_, 0, '|') for reverse @_; print("$str\n"); }, );