use strict; use warnings; use feature 'say'; use Algorithm::Combinatorics qw( combinations_with_repetition ); package Algorithm::Combinatorics { no warnings 'redefine'; sub main::combinations_with_repetition { my ($data, $k, $ref) = @_; __check_params($data, $k); return __contextualize(__null_iter()) if $k < 0; return __contextualize(__once_iter()) if $k == 0; my @indices = $ref ? @$ref : (0) x $k; my $iter = Algorithm::Combinatorics::Iterator->new(sub { __next_combination_with_repetition(\@indices, @$data-1) == -1 ? undef : [ @{$data}[@indices] ]; }, [ @{$data}[@indices] ]); my $x = __contextualize($iter); # Note: scalar context forced return [ $x, \@indices ] # + interface changed } } my @data = qw( a b c ); my ( $iter, $secret ) = @{ combinations_with_repetition( \@data, 3 )}; say @{ $iter-> next } for 1..5; my ( $iter_2 ) = @{ combinations_with_repetition( \@data, 3, $secret )}; say '**********'; $iter_2-> next; # skip 1 while ( my $p = $iter_2-> next ) { say @$p } __END__ aaa aab aac abb abc ********** acc bbb bbc bcc ccc