$re = qr{ (??{ '\b\w{1,' . ($len - ($+[0] - $-[0])) . '}\b' }) (?(?{ ($+[0] - $-[0]) < $len }) (??{ '\W{0,' . ($len - ($+[0] - $-[0])) . '}' }) ) (?(?{ ($+[0] - $-[0]) == $len }) (?&done) ) }x; s{($re+)(?%done)}{$1\n}xg;