La estructura IF-ELSE permite establecer una bifurcación o alternativa dentro de una secuencia de órdenes. Es decir, en ocasiones es posible que deseemos que el programa ejecute una instrucción o instrucciones, pero solo si se cumple determinada circunstancia, y, en caso contrario, o bien no hacer nada, o bien ejecutar otras instrucciones diferentes.
Por ejemplo, queremos hacer un alias que a intervalos de un minuto mida nuestro lag, y solo si este supera los 15 segundos nos envíe un mensaje a la pantalla de Status avisándonos de cuanto lag tenemos. Esto no es posible hacerlo mediante una secuencia lineal de instrucciones; es preciso que el programa discierna en algún momento si procede o no ejecutar la orden de imprimir un mensaje. Esta posibilidad es la que nos facilita la estructura IF.
En definitiva, IF comparará valores, y ejecutará o no diferentes instrucciones, en función del resultado de la comparativa.
Esta orden compara del contenido de dos variables, y solo en caso de que la primera variable sea mayor que la segunda enviará un mensaje a la pantalla de Status, y hará sonar un sonido Wav que supuestamente tenemos dentro de un directorio de la unidad C: llamado "sonidos".
Obsérvese que la condición del if se debe de poner entre paréntesis, y las instrucciones internas a ejecutar estarán encerradas entre llaves (si solo hay una instrucción no son necesarias las llaves).
Como se puede ver en la sintaxis general del if, junto este se pueden emplear otras dos instrucciones: elseif y else, aunque estas solo de forma opcional. Si podemos leer la sintaxis de IF de la siguiente forma:
Si ( pasa esto ) { Haz esto }
La del else if equivaldrá a:
En caso contrario, si ( pasa esto ) { Haz esto }.
El anexo else es una posibilidad que permite ejecutar una serie de instrucciones en caso de que lo anterior no se haya producido. Las instrucciones comprendidas dentro del else se ejecutarán siempre que no hay resultado cierta la condición del if ni, de existir, la del elseif. Si no se especifica un else, el script sencillamente continuará a desde la instrucción siguiente al último "}", o bien terminará si no hay nada más.
Es perfectamente posible "anidar" instrucciones if, es decir, incluir más if’s dentro del bloque de instrucciones de un if. Por ejemplo, queremos hacer un alias que se llame "números". Este, al ejecutarse, nos pedirá tres números cualesquiera que cargará en tres variables, a continuación evaluará cual es el mayor de los tres y nos lo imprimirá en la ventana de Status. Podríamos hacer algo como lo siguiente:
/números { set %A $$?="Introduce el primer número"
set %B $$?="Introduce el segundo número"
set %C $$?="Introduce el tercer número"
if ( %A > %B ) {
if ( %A > %C ) { echo -s El mayor es %A }
else { echo -s El mayor es %C }
}
}
elseif ( %B > %C ) { echo -s El mayor es %B }
else { echo -s El mayor es %C }
unset %A %B %C
Los operadores de comparación que podemos utilizar dentro de la condición de un if son los siguientes:
A isin B
|
La cadena de caracteres A se encuentra incluida dentro de la cadena B
|
|
A iswm B
|
La cadena A es idéntica a la cadena B
|
|
A isnum B
|
A es un número incluido dentro de la cadena de números B. Si no se pone B se evalúa simplemente si A es un número
|
|
A isletter B
|
Igual al anterior pero con letras en lugar de números
|
|
A ison B
|
El nick A está en el canal B
|
|
A isop B
|
El nick A es operador en el canal B
|
|
A isvo B
|
El nick A tiene voz en el canal B
|
|
A ischan
|
A está en este momento en el mismo canal que nosotros
|
|
A isauto B
|
El nick A está en muestra lista de auto-op para el canal B (B opcional)
|
|
A isignore
|
A está en nuestra lista de ignorados
|
|
A isprotect B
|
A está en nuestra lista de protegidos en el canal B (B opcional)
|
|
A isnotify
|
A está en nuestra lista de notify
|
|
En esta tabla se han usado, para hacerla más comprensible, los operándos genéricos A y B; en su lugar podemos usar valores numéricos, cadenas de caracteres, variables (identificándolas con su nombre precedido del símbolo %), o identificadores (con su nombre precedido del símbolo $).
Si anteponemos el símbolo ! delante de cualquiera de los operadores de la tabla anterior este será negado, es decir, la condición se evaluará como cierta no cuando suceda eso, sino cuando no suceda. Por ejemplo:
!isauto quiere decir que la condición se cumple cuando ese nick no está en la lista de auto-op.
Este alias lista los Ops en canal donde nos encontramos. Este es el camino difícil, desde el momento que podemos usar el comando $opnick() en vez de utilizar el comando $nick() del servidor, pero esto nos dará un ejemplo de cómo el isop puede ser utilizado y de cómo el $null es devuelto una vez que alcanzamos el final de la lista.
listops {
echo 4 * Escuchando Ops activado en #
set %i 1
:next
set %nick $nick(%i,#)
if %nick == $null goto done
if %nick isop # echo 3 %nick es un Op!
inc %i
goto next
:done
echo 4 * Fin de la lista de Ops
}
Este es un alias con definición y activación desde popups que le da Ops a los nick seleccionados en la lista de nicks.
DarOps {
%i = 0
%nicks = ""
:nextnick
inc %i
if ($snick(%i,#) == $null) { if ($len(%nicks) > 0) mode # +oooo %nicks | halt }
%nicks = %nicks $snick(%i,#)
if (4 // %i) { mode # +oooo %nicks | %nicks = "" }
goto nextnick
}
Este remote intercepta los Pings y envía un mensaje sobre los cerca o lejos que se encuentra el usuario.
on 1:ctcpreply:PING* {
if ($2 == $null) halt
else {
%pt = $ctime - $2
if (%pt < 0) set %pt 0
if (%pt < 5) echo 4 [PING reply] $nick esta demasiado cerca para mi gusto
elseif (%pt < 20) echo 4 [PING reply] $nick se encuentra a la distancia correcta
else echo 4 [PING reply] muerde el polvo $nick, muerde el polvo $nick
}
halt
}
Hasta ahora hemos visto como la estructura if puede evaluar una condición simple; no obstante es también posible crear condiciones complejas combinando varias con o operadores lógicos. El mIRC admite dos tipos de operadores lógicos para enlazar entre sí dos o mas condiciones simples formando así una sola condición múltiple:
· Operador AND (&&). En castellano "y":
Si (( pasa ésto ) y ( ésto ) y ( además ésto )) { Haz ésto }
Por ejemplo:
if (( $me !iswm Bj0rn ) && ( $me isop #Ayuda)) { mode $me -o # Ayuda}
Esta instrucción comprobará si mi nick es distinto de Bj0rn, y además si tengo el estatus de operador dentro del canal #Ayuda, de suceder ambas cosas me retirará dicho estatus.
· Operador OR ( || ). En castellano "o":
Si (( pasa ésto ) o ( ésto ) o ( ésto otro )) { Haz ésto }
Por ejemplo:
if (( %A > 20 ) || ( %B < 10 )) { echo -s Variable fuera de rango }
Esta orden comprobará que la variable %A contiene un número en el rango [10-20], en caso contrario manda al status un aviso.
|