use strict; use warnings; print join "\n", comb_thormod('A'..'R'); sub comb_thormod { my $c_out = []; permute_thormod( '', $_, $c_out, @_ ) for ( 0 .. $#_ ); return @$c_out; } sub permute_thormod { my ( $str, $depth, $c_out, @chars ) = @_; if ( !$depth-- ) { foreach (@chars) { push @$c_out, $str . $_; } } else { permute_thormod( $str . $chars[$_], $depth, $c_out, @chars[ ( $_ + 1 ) .. ($#chars) ] ) for ( 0 .. $#chars ); } }