sub genOrderedSubList { my $size= shift @_; my @list= @_; my @idx= ( -1 ); return sub { my $i= $#idx; while( 1 ) { do { ++$idx[$i]; if( $#list < $idx[$i] ) { if( --$i < 0 ) { @idx= ( -1 ); return; } redo; } } while( 0 < $i && $list[$idx[$i]] <= $list[$idx[$i-1]] ); return @list[@idx] if $i == $size-1; $idx[$i+1]= $idx[$i]; ++$i; } } } @ARGV= ( 3, 2,1,4,3,5 ) if ! @ARGV; my $gen= genOrderedSubList( @ARGV ); my @res; while( @res= $gen->() ) { print "@res\n"; }