#!/usr/bin/perl -l use strict; use Algorithm::Loops 'NestedLoops'; sub pick { my( $k, @chars ) = @_; my $idx = NestedLoops( [ $k < 0 ? ( sub { [ ( @_ ? 1+$_ : 0 ) .. @chars+$k+@_ ] } ) x -$k : ( sub { [ ( @_ ? $_ : 0 ) .. $#chars ] } ) x $k ] ); return sub { @chars[ $idx->() ] }; } @ARGV = ( 3, 'a'..'e' ) if ! @ARGV; my( $k, @chars ) = @ARGV; if( 1 < @chars ) { } elsif( $chars[0] =~ /^[1-9][0-9]*$/ ) { @chars = 1..$chars[0]; } else { @chars = $chars[0] =~ /./g; } my $iter = pick( $k, @chars ); while( my @subset = $iter->() ) { print "@subset"; }