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