¡Menuda sorpresa!
Pues resulta que en AutoIt hay dos tipos de comparadores con cadenas, el
"=" no tiene en cuenta el caso (mayúsculas/minúsculas), si quieres tenerlo en cuenta hay que usar el operador
"=="
Así que
"abc" = "ABC" es cierto, pero
"abc" == "ABC" es falso.
Lo que no sabía, y que comprobamos con tu código es que el
Switch hace las comparaciones sin ser caso sensitivo.
Pregunta para la comunidad:
¿HAY ALGUNA MANERA DE HACER QUE SWITCH HAGA COMPARACIONES DE CADENA CASO SENSITIVO?
Se me ocurren dos soluciones:
1) Usar
Select en vez de
Switch. Cuando son equivalentes me gusta más el segundo porque es más compacto, pero en este caso no son equivalentes porque en el
Select pones la comparación a mano, con lo que podemos especificar que queremos el operador
"==":
Código: Seleccionar todo
$cadena = "HOL hol"
$res = ""
For $i = 1 To StringLen($cadena)
$caracter = StringMid($cadena, $i, 1)
Select
Case $caracter == "H"
$caracter = "p"
Case $caracter == "O"
$caracter = "a"
Case $caracter == "L"
$caracter = "r"
;Ahora con las minusculas
Case $caracter == "h"
$caracter = "P"
Case $caracter == "o"
$caracter = "A"
Case $caracter == "l"
$caracter = "R"
EndSelect
$res &= $caracter
Next
ConsoleWrite($res & @CRLF)
2) La otra manera que se me ocurre es usar los valores numéricos de los caracteres, su código
ASCII, al ser números no se ven afectador por el tipo de comparación. No hace falta poner los números a mano, que también valdría, pero simplemente podemos decir a AutoIt que lo calcule con la función
Asc(). En este caso si no hay sustitución por ejemplo recompongo el código
ASCII al carácter original usando la función
Chr() en el
Case Else (se podría hacer de otra manera, como guardando el caracter inicial antes de hacerle el
Asc())
Código: Seleccionar todo
$cadena = "HOL hol"
$res = ""
For $i = 1 To StringLen($cadena)
$caracter = Asc(StringMid($cadena, $i, 1))
Switch $caracter
Case Asc("H")
$caracter = "p"
Case Asc("O")
$caracter = "a"
Case Asc("L")
$caracter = "r"
;Ahora con las minusculas
Case Asc("h")
$caracter = "P"
Case Asc("o")
$caracter = "A"
Case Asc("l")
$caracter = "R"
Case Else
$caracter = Chr($caracter)
EndSwitch
$res &= $caracter
Next
ConsoleWrite($res & @CRLF)
Por cierto, ¿no dirías que mis códigos indentados se leen mejor que el tuyo que empieza todo al principio de la línea? Al hacerlo como yo se ve claramente de dónde a donde van los bucles, condicionales, funciones, etc... Te recomiendo hacerlo así, de lo contrario los programas se pueden hacer muy complicados de leer, casi imposible cuando empiezan a encadenar
If,
While y compañía.