sub modify { my ($str) = @_; my ($head, $tail) = ( substr($str, 0, 1), substr($str, 1, length($str)-1) ); return length($tail) ? map { (lc($head) . $_, uc($head) . $_) } modify($tail) : $head; } printf("$_\n") foreach ( modify('abcdef') );