Вы находитесь на странице: 1из 5

En los script in perl, los datos temporales se mantienen en variables; stos se comportan en lneas generales como las variables

de ambiente, pero no son lo mismo. El tipo principal de variable en perl es el escalar. Un escalar es una cadena, o un nmero que no necesita ser convertido como en C. Adems, todos los escalares pueden ser enteros o nmeros en coma mvil, que el perl se ocupar de representar como enteros, si es posible, para mejorar la velocidad de ejecucin. Cada variable tiene un nombre que comienza siempre con un carcter especial que indica el tipo, seguido por un nombre de al menos una letra. Todos los nombres de las variables son casas-sensitivas, por lo que $variable es diferente de $Variable y de $VaRiAbLe. El carcter espacial del que se hablaba es $, y se utiliza tanto al asignar una variable como cuando se usa su valor. $bla = 1; asigna 1 a la variable escalar $bla $bla = "1"; asigna a bla la cadena "1", que equivale a sobre $ops = $bla +1; $ops es 2 $bla = "adis\n"; \n es un regreso al inicio print $bla; visualiza adis En los script de shell, el carcter $ se usa slo cuando se solicita el valor de una variable, no cuando se le asigna: bla = 1 $bla En los script, las cadenas estn dentro de "" o '' , con la diferencia de que entre "" las variables sern interpoladas y entre '' las variables se considerarn literalmente. Cada vez que puede aparecer una ambigedad, como largo puede ser el nombre de una variable, $variabile puede escribirse como ${variabile}. $bla = "eeek!"; $blabla = "uff!"; print "$blabla\n"; visualiza "uff" print "${bla}bla\n" visualiza "eeek!bla" $bla = "eek!";

$msg = "$bla me has asustado"; $msg contiene "eeek! me has asustado $msg2 = '$bla me has asustado'; ahora contiene "$bla me has asustado En perl, como en el shell scripting (e diferentemente del C) no hay que expresar las variables antes de usarlas: la primera vez que se utiliza una variable, se expresa. Intentar la lectura de un valor inexistente lleva a tener una cadena vaca que, en contexto numrico, se interpreta como 0. Las variables cuyo nombre empieza (tras el cannico $) con un carcter especial, que no es una letra, se consideran 'reservadas' (una lista se puede encontrar en man perlvar en perl5). Estas variables cambian algunos comportamientos del perl segn en propio valor. Una de stas en la variable $_ , a la que se deja libre para permitirle al usuario que inserte datos temporalmente, y tiene adems la particularidad de que muchas funciones operan con $_ si no est equipado con algn valor. $_ = "bla bla bla\n"; print; visualiza el contenido de $_ Daos cuenta de que no todas las funciones asumen $_ como defecto, incluso si esto funciona con todas las funciones en las que tiene sentido asumir la variable $_ . En caso de duda, se puede recurrir a un piccolo script de un par de lneas para ver si la funcin que interesa puede trabajar con $_ Otras variables importantes reservadas son: $$ muestra el PID del programa $< muestra el UID del usuario que ha ejecutado el programa $0 muestra el nombre del programa $! muestra el estado de la ltima llamada del programa $? muestra el estado de regreso de la ltima operacin de ejecucin de un proceso externo $@ muestra el ltimo mensaje de error producido por el script Otro tipo de dato es el array; un array es una lista numerada de escalares. El array se identifica por el smbolo @, del mismo modo que $ indica el escalar. Todos los array estn numerados a partir de 0: el primer elemento asume el nmero 0; el segundo, 1 y as sucesivamente. Los elementos se insertan en un array bajo la forma de una lista separada por comas y entre parntesis. El elemento n del genrico array @array se define como $array[n]. En este caso se usa $ en lugar de @ porque se refiere a un escalar y no a todo el array. $var = 1; define una variable @array = ("bla", 34, "uff", $var); define el array; daos cuenta de que un elemento se define con el valor de $var $segundo = $array[1]; toma el segundo valor del array y se lo asigna a $secondo, que se convierte en 34 @eek = @array[0, 2];

@eek se convierte en ("bla", "uff"), ya que toma el primer y tercer valor de @array @urka = (@array, @eek); ste NO es un array de array, pues los array siempre son array de escalares. Lo que sucede es que todos los valores de @array e @eek son copiados en @urka, que se convierte en ("bla", 34, "uff", 1, "bla", "uff") Hay funciones que operan sobre los array, aadiendo elementos al final, quitndolos, extrayendo los que satisfacen una condicin dada, ordenndolos, etc. La que se llama "size" de un array (es decir el nmero de elementos menos uno) llamado @array es dado por $#array. Para los array vacos, sta se asume como -1. @array = ("bla", "bla", "bla", "bla"); print $#array, "\n"; mostrar 3, y no 4 (fijaos en que el smbolo # en $#array no introduce un comentario). Hemos visto que en una cadena entre "", las variables se interpolan de manera que "bla$eek" significa "blabla" si $eek es bla. Esto se aplica tambin a los array. Es necesario tener cuidado con una cosa: print "mi direccin es root@localhost\n"; <- NO funciona print "mi direccin es root\@localhost\n"; <- funciona Esto sucede porque el carcter @ se considera especial y, si se quiere que aparezca literalmente (o sea que se considere como un simple carcter, no como un array), es necesario introducirlo con \ , que que protege el siguiente carcter de una interpretacin diferente de la literal, como ocurre con otros caracteres como " o \. En este caso, \@ se conoce como carcter de escape; veamos otros: \\ \" \$ \@ \' \a \b \e \n \r \0n \xn \ " $ @ ' BELL BS (backspace) ESC LF (Line - feed) CR (Carriage return) Nmero octal representado por 'n' Nmero decimal

Si queris divertiros probad a lanzar este script: #!/usr/bin/perl print "\a";

Qui \a se considera un carcter de escape, y no ser mostrado \a, como esperbais. Para ver \a, el script tiene que ser: #!/usr/bin/perl print "\\a\n"; \n no es estrictamente necesario, pero es til para ver \a en una lnea vaca sin el prompt Como alternativa, se puede escribir lo siguiente: print 'mi direccin es root@localhost', "\n"; que muestra mi direccin es root@localhost. Pero cuidado a no introducir en la expresin anterior variables que tienen que ser interpoladas: simplemente no conseguiramos la interpolacin! El tercer (y ltimo, por lo que nos respecta) tipo de datos en perl es el hash, llamado tambin array asociativo. Los hash se introducen con el smbolo % y contienen escalares indicizados por otros escalares. El mejor modo para entender los hash consiste en pensar en un vocabulario: cada hash contiene valores (las definiciones en el vocabulario) asignados a los identificadores (las palabras), y las operaciones base son aadir o quitar palabras o cambiar su valor, controlando si cada una de ellas existe o o no en el vocabulario. %bla = ("eek", 34, "uff", 18, "cero", "nada); fjate que en la expresin anterior todas las cademas se podran haber escrito tambin entre '' Por claridad, los hash se pueden escribir tambin como: %bla = ( "eek" => 34, "uff" => 18, "cero" => nada, ) Continuamos con los ejemplos: print $bla{"eek"}, "\n"; muestra 34 $s = 'cero'; @arr = ($bla{"uff"},$bla{$s}; @arr se convierte en (18, "nada") Estos tres tipos de variables (escalares, array y hash) pueden perfectamente tener el mismo nombre: en el mismo cdigo se pueden encontrar el escalar $abc, el array @abc y el hash %abc. Veamos una ltima cosa: intentad ejecutar este script: #!/usr/bin/perl print "Cmo te llamas?\n"; $nombre = <STDIN>; print "Hola $nombre\n";

Como habris notado, el script se interrumpe pidindonos nuestro nombre (pero podra pedir cualquier otra informacin). Qu est pasando? En fin, es suficiente saber que el smbolo <STDIN> es el handler del file de input estndar, es decir un file siempre abierto durante la ejecucin del programa y que representa el teclado del terminal de quien ejecuta el script. Con la lnea $nombre = <STDIN> se le dice al script que almacene en la variable $nombre lo que el usuario teclea hasta que termina con la tecla enviar. Los canales estndar de comunicacin son 3 y a cada uno est asociado un handler: <STDIN> standar input <STDOUT> standard output <STDERR> standard error Stdout se puede ver como el canal a travs del cual se emite el output. STDERR es parecido a STDIN, pero se utiliza normalmente para mostrar los mensajes de error.

Вам также может понравиться