Variables

 

Variables.-

 

 

            El uso de variables es un recurso fundamental en programación. Consideremos una variable informática como un recipiente en el que podemos depositar un valor cualquiera, para después hacer uso de él dentro de una instrucción, de esta forma no tendremos que tocar la instrucción cada vez que queramos alterar el valor que se introducirá, sino simplemente asignar antes un nuevo valor a la variable.

 

            Una variable no es más que un espacio de nuestra memoria RAM (una dirección de memoria) que queda reservado en el momento en que se crea la variable, e identificado temporalmente con el nombre que se le asigne a dicha variable. Cada vez que se asigne un valor a la variable, el programa lo que hace es depositar ese valor en dicha dirección reservada. Cuando ejecutemos una instrucción que contenga esa variable, el programa irá a ese espacio de memoria, tomará el valor que contenga y lo pondrá en el lugar del nombre de la variable dentro de la instrucción.

 

            Por ejemplo, si en un script para mIRC hemos creado una variable llamada %num, a la que hemos asignado el valor 3.14159, podemos tener una instrucción como la siguiente:

 

                        Echo –a El valor asignado es: %num

 

            Esta orden presentará en la ventana activa el mensaje que diga:

 

                        “El valor asignado es: 3.14159”

 

            Si queremos que el valor que se presente sea otro, no tenemos mas que asignar previamente una valor distinto a la variable.

 

            El uso de las variables es sencillo, en mIRC lo único que hace falta es identificarlas con un nombre de nuestra elección y precederlas del símbolo %.

 

            Para crear nuestras variables en mIRC procederemos usando la siguiente orden:

 

                        set <%varable> [valor]

 

            Por ejemplo:

 

                        set %num 3.14159

 

            No es necesario preocuparse de que tipo es la información que se deposite dentro de la variable, es decir, si se trata de una cadena de caracteres, de un número entero o un número que contenga parte entera y decimal, esta distinción la hace el programa en el momento en que hagamos uso de ella; en principio todas las variables se consideran como una cadena de caracteres, pero si empleamos para manejarlas operadores aritméticos, el programa las transforma internamente en el valor numérico que corresponda, la única limitación es que solo se consideraran los cinco primeros valores decimales, es decir, los cinco primeros dígitos tras la coma decimal.

 

Recursos de asignación.-

 

            Asignar valores a una variable se puede hacer de forma directa como hemos visto, o de forma indirecta a través de algún recurso del programa. Por ejemplo, si queremos que la variable %MiNick reciba el nick que estemos usando en cada momento sin tener que especificarlo en cada momento, podemos recurrir a la función o identificador $me, que nos devuelve nuestro nick actual. La asignación sería entonces:

 

                        set %MiNick $me

 

            También podemos asignar a una variable el valor de otra variable:

 

                        set %var2 %var1

 

            Incluso podemos hacer que el programa nos pregunte que valor queremos asignar cuando el script llegue a ese punto:

 

                        set %variable $$?=”Introduce un valor para la variable”

 

            Asimismo es posible también hacer que una variable reciba directamente el resultado de operaciones aritméticas sencillas:

 

%x = 5 + 1 à Suma

%x = 5 - %y à Resta

%x = %y * 2 à Producto

%x = %z / $2 à División

%x = $1 % %h à Módulo (Resto de la división: $1 entre %h)

%x = 2 ^ %w à Potencia

 

            Solo es posible asignar el resultado de operaciones simples, para el uso de operaciones más complicadas es preciso recurrir al uso de la función $calc (ver identificadores).

 

            Finalmente podremos hacer incrementos o decrementos del valor numérico de un variables con las ordenes.

 

                        inc %varciable à Incremento

                        dec %variables à Decremento

 

            Por ejemplo:

 

                        set %valor 5

                        set %cifra 2

                        dec %valor %cifra

                        echo –a El valor actual es: %valor

 

            En la pantalla aparecerá el siguiente mensaje:

 

                        “El valor actual es: 3”

 

            Si en algún momento hacemos uso de una variable que aún no ha sido creada, o bien, que no contiene ningún valor, está devolverá el parámetro $null (nulo), esto solo será útil en las comparaciones de tipo if-else.

 

            NOTA.- Podemos consultar todas las variables existente en un momento determinado, así como el valor que contienen (alterándolo manualmente si lo deseamos) desde el menú Herramientas, Editor de script, en la solapa “variables”.

 

Eliminación de variables.-

 

            Eventualmente es posible también la eliminación de variables, es decir, hacer que desaparezca la reserva de memoria que la creación de la variable supuso. La orden para esto es la siguiente:

 

                        unset <%variable_1>

 

            Es posible usar también el carácter * para eliminar grupos de variables, por ejemplo:

 

                        unset %nom*

 

            Esta orden eliminará todas las variables cuyo nombre empiece por “nom”

 

            Finalmente podemos también eliminar todas las variables instaladas con la orden:

 

                        unsetall

 

La estructura condicional (IF-ELSE).-

 

            La estructura IF-ELSE permite establecer una alternativa dentro de una secuencia de órdenes. Es decir, determinar que el programa ejecute una instrucción o instrucciones si se cumple o cumplen determinadas circunstancias y en caso contrario, o bien no hacer nada, o 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 que nos envíe un mensaje a la pantalla de estado avisándonos de cuanto lag tenemos. Esto no es posible hacerle mediante una secuencia lineal de instrucciones, es preciso que el programa discierna en algún momento si procede o no ejecutar la orden. 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.

 

            El formato general completo de la estructura IF es el siguiente:

 

                        if (valor_1 operador valor_2) {

                        comandos }

                        elseif (valor_1 operador valor_2) {

                        comandos }

                        else { comandos }

 

            La orden if comparará valor_1 y valor_2 mediante un operador de comparación. En función de esta comparación ejecutará o no el comando o comandos incluidos dentro de las llaves. Por ejemplo:

 

                                   if (%variable1 > %variable2) {

                                   echo –s Atención, la primera variable es mayor que la segunda!!!

                                   splay c:\sonidos\alarma.wav

                                   }

 

            Esta orden compara el contenido de dos variables, y solo si la primera es mayor que la segunda enviará un mensaje a la ventana de estado y hará sonar un sonido wav que supuestamente tenemos guardado en el directorio de la unidad c: llamado sonidos.

 

            Obsérvese que la condición if se debe de poner entre paréntesis y las instrucciones internas a ejecutar se encerrarán entre llaves (si solo se usa una instrucción no son necesarias las llaves).

 

            Como se puede ver en la sintaxis general de if, junto a este se pueden usar otras dos instrucciones: elseif y else, aunque estas solo de forma opcional. La sintaxis de if se puede interpretar de la siguiente forma: Si (pasa esto) { Haz esto } la de elseif de la forma: En caso contrario, si (pasa esto) { Haz esto }. El else permite ejecutar una seria de instrucciones en caso de que lo anterior no se haya producido, las instrucciones dentro del else se ejecutarán siempre que no haya resultado cierto en la condición if ni, de existir, en elseif.

 

            Es posible asimismo 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” que al ejecutarse, nos pida tres números cualesquiera que cargará en tres variables, a continuación evaluará cual es mayor de las tres y nos lo imprimirá en la ventana de estado, para eso podríamos hacer lo siguiente:

 

                        /numeros {

                        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 número es %A }

                        else { echo –s El mayor número es %C }

                        }

                        elseif (%B > %C) { echo –s El mayor número es %B }

                        else {echo –s El mayor número es %C}

                        unset %A %B %C

                        }

 

           

                        Los operadores de comparación que podemos usar dentro de la condición de un if son los siguientes:

 

                        A == B à A es igual a B

                        A != B à A es distinto de B

                        A < B à A es menor que B

                        A > B à A es mayor que B

                        A >= B à A es mayor o igual que B

                        A <= B à A es menor o igual que B

                        A // B à A es múltiplo de B

                        A \\ B à A no es múltiplo de B

                        A isin B à La cadena de caracteres A se encuentra dentro de la cadena B

                        A iswm B à La cadena A es idéntica a la cadena B

                        A isnum B à A es un numero incluido en la cadena B. Si no se pone B se evalúa solo si A es un número.

            A isletter B à Igual que el 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 à El nick A está en el mismo canales que nosotros en este momento

            A isauto B à El nick A está en nuestra lista de auto-op para el canal B (B es opcional)

            A isignore à Ell nick A esta en nuestra lista de ignorados

            A isprotect B à El nick A es protegido en el canal B

            A isnotify à El nick A está en nuestra lista de notify

 

            En esta tabla se han usado, para hacerla mas comprensible, genéricamente 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 se cumpla sino cuando no se cumpla.

 

            También es posible crear condiciones más complejas combinando varias con los operadores lógicos. El mIRC admite dos tipos de operadores lógicos para enlazar entre sí dos o más condiciones simples formando así una sola condición múltiple:

 

1.      Operador AND (&&), en castellano “y”.

 

Si ((pasa esto) y (esto) y (además esto)) { Haz esto }

 

            Por ejemplo:

 

            if (($me !iswm Juan) && ($me isop #ayuda)) { mode $me –o #ayuda }

 

            Esta instrucción comprobará si mi nick es distinto de Juan, y además si tengo el estado de operador en el canal #ayuda, de suceder ambas cosas me retirará dicho estatus.

 

2.      Operador OR (||), en castellano “o”.

 

Si ((pasa esto) o (esto) o (esto otro)) { Haz esto }

 

Por ejemplo:

 

if ((%A > 20) || (%B < 10)) { echo –s Variable fuera de rango }

 

Esta instrucción comprobará si la variable %A es un número en el rango [10-20], en caso contrario manda un aviso a la ventana de estatus.

 

El comando goto.-

 

El uso del comando goto es un recurso muy útil en especial cuando se utiliza desde dentro de una estructura if. La sintaxis de este comando es:

 

            goto <etiqueta>

 

La orden goto provoca un salto automático dentro de la secuencia que el programa utiliza para leer las líneas de un script, pasando directamente a leer a partir de una determinada etiqueta las líneas que continúan a partir de esta. Una etiqueta no es más que una palabra que ocupa una línea del script, y que se identifica como tal por tener el símbolo “:” delante. La llamada a una etiqueta desde la orden goto no debe de llevar los dos puntos delante.

 

            Ejemplo:

 

            /CargarVar {

            :PideDato

set %valor $$?=”Introduce un número entre 0 y 9”

if ((%valor < 0) || (%valor > 9)) {

echo –a Dato erróneo, introduzca solo un dígito entre 0 y 9

goto PideDato

}

}

 

Este alias es una sencilla rutina que nos permite aceptar valores para una variable, depurando que solo se introduzca un dígito entre 0 y 9, de no ser así el alias volverá una y otra vez a la etiqueta PideDato solicitando un nuevo valor para la variable.

 

            Ejemplos:

 

1.- El siguiente alias nos presentará la lista de operadores del canal en que nos encontremos en este momento. Se puede observar el empleo de la instrucción de salto incondicional (goto), el uso del parámetro $nick(canal,número), el comando inc(%variable) y la estructura if.

 

/listaOps {

echo –a * Listando Operadores en #

set %i 1

:sigue

set %nick $nick(#,%i)

if (%nick == $null) { goto final }

if (%nick isop #) { echo 3 %nick es un Op }

inc %i ;(Se incrementa en un la variable %i)

goto sigue

:final

echo –a * Fin de la lasta de operadores de #

}

 

2.- Este ejemplo presenta un alias que imprimirá en la pantalla de estatus una tabla de caracteres ASCII entre el 33 y el 241 ambos inclusive.

 

/TablaASCII {

set %num 33

echo –s Tabla ASCII

:presenta

if (%num > 241) { goto fin }

echo –s $chr(%num) es el carácter ASCII del número: %num

inc %num

goto presenta

:fin

echo –s Fin de la lista

}