Programación en Perl para administradores de sistemas
¿Qué necesitamos?Intérprete:
Linux: viene por defecto en todas las distribuciones
Unix: ...cualquier sistema UNIX que se precie lo incluye
Mac: viene en el sistema (como buen UNIX que es). Alternativas
macports: http://goo.gl/k5HnD
Active Perl: http://goo.gl/V8R3h
Windows:
Active Perl: http://goo.gl/V8R3h
Cygwin: http://goo.gl/czYc5
¿Qué necesitamos?IDE:
Plugin de eclipse: http://goo.gl/RnAvo
Komodo (Comercial): http://goo.gl/rtnEi
Komodo Edit (open source): http://goo.gl/m1d0c
padre (linux y windows, en mac la instalación se puede complicar por necesitarse un entorno de 32 bits): http://goo.gl/jh6ca
vi, emacs, joe, gedit, kate... o cualquier editor de texto de UNIX que soporte resaltado de sintaxis.
más información: perlfaq3 (http://goo.gl/QkJLL)
¿Perl es fácil o difícil?
Perl es fácil de usar, pero “difícil” de aprender
while (<>) {chomp;print join("\t", (split /:/)[0, 2, 1, 5] ), "\n";
}
Una vez se maneja la sintaxis es un lenguaje muy productivo:
con pocas líneas de texto se consiguen muchos resultados
Nota curiosa: asemejar la sintaxis de perl con las contracciones en inglés.
¿Cuándo usar perl?
Vale para todo:
Desde pequeños prototipos o programas “rápidos” escritos en 5 minutos
Hasta grandes proyectos que impliquen a varios programadores.
Es la mejor herramienta para problemas en los que haya que trabajar con texto el 90% del tiempo y un 10% en el resto.
En su día era el motor de las webs dinámicas (que se ajustan a la perfección al caso anterior)
¿Cuándo no usarlo?
Si el software a distribuir no se puede distribuir con código fuente: No se pueden generar binarios.
Si no quieres que tus colegas te miren raro...
Nuestro primer programa
1.#!/usr/bin/perl
2.print "Mi primer programa\n";
Línea 1: indica al intérprete qué ejecutable usar para interpretar el programa
Línea 2: imprime por pantalla
Abrimos nuestro editor de texto/IDE y escribimos
Ejecutando el programa
A través de nuestro IDE, si lo soporta
Usando la línea de comandos:
perl miscript.pl
chmod +x miscript.pl./miscript.pl
Esta forma sólo funciona si el script contiene la línea #!/usr/bin/perl
...y ahora lo escribimos en perl
1.#!/usr/bin/perl
2.use 5.010;
3.say "Hello World!";
línea 2: forzamos el uso de una versión determinada de perl (5.10)
línea 3: usamos la función “say” (disponible en 5.10) porque es más concisa (escribimos menos)
Un script que hace “algo”
...no te preocupes si no lo entiendes
¡para eso estamos aquí!
1.#!/usr/bin/perl
2.@lines = `perldoc -u -f atan2`;
3.foreach (@lines) {
4. s/\w<([^>]+)>/\U$1/g;
5. print;
6.}
http://www.marcports.org http://www.activestate.com/activeperl http://www.cygwin.com http://www.epic-ide.org
http://www.activestate.com/komodo-ide http://www.activestate.com/komodo-edit http://padre.perlide.org http://perldoc.perl.org/perlfaq.html#the-perlfaq3-manpage%3a-Programming-Tools
Escalares
Escalares
Tipo de dato más simple que podemos encontrar en perl
Escalares
Tipo de dato más simple que podemos encontrar en perl
Sirve para almacenar “una unidad algo”
Escalares
Tipo de dato más simple que podemos encontrar en perl
Sirve para almacenar “una unidad algo”
La mayoría de escalares son números o cadenas de caracteres.
Escalares
Tipo de dato más simple que podemos encontrar en perl
Sirve para almacenar “una unidad algo”
La mayoría de escalares son números o cadenas de caracteres.
Sí, en perl no hay mucha diferencia entre una cadena y un número y el intérprete puede usarlos indistintamente en casi todos los contextos.
Escalares: números
Escalares: números
Definición de literal: cómo se representa un valor en el código fuente de perl.
Escalares: números
Definición de literal: cómo se representa un valor en el código fuente de perl.
Perl almacena los números internamente siempre como “double”, no existe el entero internamente en perl.
Escalares: números
Literales en coma flotante
1.25
7.25e45
-15e-10
-1.2E23
Escalares: números
Literales de entero
0
2011
-40
8817264612412Este número es un poco difícil de leer ¿verdad?
Escalares: números
Literales de entero
0
2011
-40
8_817_264_612_412Así es más claro. Más adelante veremos porqué no podemos usar la coma
Acordarse más adelante de decir porqué no podemos usar la coma para separar grupos de números.
Escalares: números
Escalares: números
Números en hexadecimal:
0xD4F3
0x1377_0B77
Escalares: números
Números en hexadecimal:
0xD4F3
0x1377_0B77
Números en octal:
0377
Escalares: números
Números en hexadecimal:
0xD4F3
0x1377_0B77
Números en octal:
0377
Números en binario:
0b111101101
0b111_101_101
Escalares: números
Operadores:
2 + 3
5.1 - 2.4
3 * 12
14 / 2
10.2 / 0.3
10 % 3 (Resto de la división entera = 1)
10.5 % 3.2 (se calcula como 10 % 3)
2**3 (2 al cubo = 8)
Escalares: cadenas
Una cadena es una secuencia de caracteres, por ejemplo:
hola
☃★๛
Cadena más corta: cadena vacía
Cadena más larga: la que soporte nuestra memoria ¡no hay límite a nivel del intérprete!
Tal y como dice el libro, podríamos coger un binario, meterlo en un escalar como una cadena de texto, modificarlo y guardarlo a disco. ¿Tenemos un ejemplo de esto en algún lado?
Escalares: cadenas
Perl soporta unicode.
No activo por defecto por compatibilidad con scripts más antiguos.
Para activarlo, utilizar el siguiente pragma al inicio de nuestros scripts:
use utf8
El fichero tiene que almacenarse en utf8/unicode
Escalares: cadenas
Literales de cadena en perl usando comillas simples:
‘hola’
‘’ -> cadena vacía
‘Cadena con dos \‘apostrofos\’ dentro’
‘Cadena con una \\ barra invertida’
‘Cadena con unretorno de carro’ (contiene 30 caracteres)
Escalares: cadenas
Literales de cadena en perl usando comillas dobles:
“hola”
“” -> cadena vacía
“Cadena con dos \”comillas\” dentro”
“Cadena con ‘comillas simples’ dentro“
Las comillas dobles expanden los caracteres de escape:
“hola\ta todos” ->tabulador
“hola a todos\n”
“x{2668}”
Escalares: cadenas
Escalares: cadenas
\n Newline
\r Return
\t Tab
\f Formfeed
\b Backspace
\a Bell
\e Escape (ASCII escape character)
\007 Any octal ASCII value (here, 007 = bell)
\x7f Any hex ASCII value (here, 7f = delete)
\x{2744} Any hex Unicode code point (here, U+2744 = snowflake)
Escalares: cadenas
\n Newline
\r Return
\t Tab
\f Formfeed
\b Backspace
\a Bell
\e Escape (ASCII escape character)
\007 Any octal ASCII value (here, 007 = bell)
\x7f Any hex ASCII value (here, 7f = delete)
\x{2744} Any hex Unicode code point (here, U+2744 = snowflake)
\cC A “control” character (here, Ctrl-C)
\\ Barra invertida
\“ Comilla doble
\l Siguiente letra en minúscula
\L Todas las siguientes letras en minúscula hasta que se encuentre \E
\u Siguiente letra en mayúscula
\U Todas las siguientes letras en mayúscula hasta que se encuentre \E
\Q Escapa todo lo que no sea una letra añadiendo una barra invertida hasta que se encuentre \E
\E Finaliza \L, \U, or \Q
Escalares: cadenas
Las comillas dobles interpolan variables
1.#!/usr/bin/perl
2.use 5.010;3.use utf8;
4.$saludo = 'Hola';
5.say "$saludo a todos";
------
Salida: Hola a todos
Escalares: operadores de cadenas
Escalares: operadores de cadenas
Concatenación: · (punto)
“hola” . ‘ a todos’
“hola a todos” . “\n”
Escalares: operadores de cadenas
Concatenación: · (punto)
“hola” . ‘ a todos’
“hola a todos” . “\n”
Repetición de cadena
“Cadena”x3 -> devuelve CadenaCadenaCadena
Escalares: operadores de cadenas
Concatenación: · (punto)
“hola” . ‘ a todos’
“hola a todos” . “\n”
Repetición de cadena
“Cadena”x3 -> devuelve CadenaCadenaCadena
¿Qué devuelve lo siguiente?
5x4.8
Escalares: operadores de cadenas
Concatenación: · (punto)
“hola” . ‘ a todos’
“hola a todos” . “\n”
Repetición de cadena
“Cadena”x3 -> devuelve CadenaCadenaCadena
¿Qué devuelve lo siguiente?
5x4.8 -> 5555
Escalares: conversión automática de tipos
¿porqué 5x4.8 devuelve 5555?
Para perl no hay mucha diferencia entre 5 y “5” a la hora de almacenar. La distinción se hace a la hora de “usar” el literal.
x es un operador de cadena, y espera dos argumentos:
una cadena a la izquierda
un entero a la derecha
por lo tanto, convertirá el primer operando a una cadena y el segundo a un entero
lo hace el sólo, nosotros no tenemos que preocuparnos de hacer la conversión de tipos
Escalares: conversión automática de tipos
un pequeño test:
Escalares: conversión automática de tipos
un pequeño test:
say “12” * “3”;say “5” + 24;say 7 . 34;say 7.34;
say “hola” * 3;say 6 * “12 es docena”;
say “1.67” * “100”;say ‘0xF’ * 10;
Escalares: conversión automática de tipos
un pequeño test:
say “12” * “3”;say “5” + 24;say 7 . 34;say 7.34;
say “hola” * 3;say 6 * “12 es docena”;
say “1.67” * “100”;say ‘0xF’ * 10;
3629
Escalares: conversión automática de tipos
un pequeño test:
say “12” * “3”;say “5” + 24;say 7 . 34;say 7.34;
say “hola” * 3;say 6 * “12 es docena”;
say “1.67” * “100”;say ‘0xF’ * 10;
3629734
Escalares: conversión automática de tipos
un pequeño test:
say “12” * “3”;say “5” + 24;say 7 . 34;say 7.34;
say “hola” * 3;say 6 * “12 es docena”;
say “1.67” * “100”;say ‘0xF’ * 10;
36297347.34
Escalares: conversión automática de tipos
un pequeño test:
say “12” * “3”;say “5” + 24;say 7 . 34;say 7.34;
say “hola” * 3;say 6 * “12 es docena”;
say “1.67” * “100”;say ‘0xF’ * 10;
36297347.34
0 (número)
Escalares: conversión automática de tipos
un pequeño test:
say “12” * “3”;say “5” + 24;say 7 . 34;say 7.34;
say “hola” * 3;say 6 * “12 es docena”;
say “1.67” * “100”;say ‘0xF’ * 10;
36297347.34
0 (número)72
Escalares: conversión automática de tipos
un pequeño test:
say “12” * “3”;say “5” + 24;say 7 . 34;say 7.34;
say “hola” * 3;say 6 * “12 es docena”;
say “1.67” * “100”;say ‘0xF’ * 10;
36297347.34
0 (número)72167
Escalares: conversión automática de tipos
un pequeño test:
say “12” * “3”;say “5” + 24;say 7 . 34;say 7.34;
say “hola” * 3;say 6 * “12 es docena”;
say “1.67” * “100”;say ‘0xF’ * 10;
36297347.34
0 (número)72167
0 (número)
Escalares: conversión automática de tipos
un pequeño test:
say “12” * “3”;say “5” + 24;say 7 . 34;say 7.34;
say “hola” * 3;say 6 * “12 es docena”;
say “1.67” * “100”;say ‘0xF’ * 10;
36297347.34
0 (número)72167
0 (número)
Escalares: warnings
Se pueden activar de dos maneras:
use warnings; (sólo a partir de 5.6)
#!/usr/bin/perl -w
perl -w script.pl
La primera tiene la ventaja de que se activan sólo para el fichero en la que usa el pragma. Las otras dos se activan para todos los guiones.
Escalares: warnings
say “5” + 3; -> no genera un warning
say “5 manzanas” + 3 -> genera un warning
Argument "5 manzanas" isn't numeric in addition (+) at warnings.pl line 12 (#1)
Escalares: warnings
¿y si el warning no es suficiente?
use diagnostics
perl -Mdiagnostics script.pl
Argument "5 manzanas" isn't numeric in addition (+) at diagnostics.pl line 12 (#1) (W numeric) The indicated string was fed as an argument to an operator that expected a numeric value instead. If you're fortunate the message will identify which operator was so unfortunate.
http://perldoc.perl.org/perldiag.html tiene toda la documentación sobre los errores
Escalares: variables
Escalares: variables
Almacenan un escalar
Escalares: variables
Almacenan un escalar
Comienzan por $ seguido de un identificador:
Escalares: variables
Almacenan un escalar
Comienzan por $ seguido de un identificador:
$nombre
Escalares: variables
Almacenan un escalar
Comienzan por $ seguido de un identificador:
$nombre
$_nombre
Escalares: variables
Almacenan un escalar
Comienzan por $ seguido de un identificador:
$nombre
$_nombre
$apellido1
Escalares: variables
Almacenan un escalar
Comienzan por $ seguido de un identificador:
$nombre
$_nombre
$apellido1
$nombre_y_apellidos_del_usuario
Escalares: variables
Almacenan un escalar
Comienzan por $ seguido de un identificador:
$nombre
$_nombre
$apellido1
$nombre_y_apellidos_del_usuario
$2nombres -> MAL
Escalares: variables
Almacenan un escalar
Comienzan por $ seguido de un identificador:
$nombre
$_nombre
$apellido1
$nombre_y_apellidos_del_usuario
$2nombres -> MAL
$años -> correcto si se utiliza use utf8;
Escalares: variables
Asignando valores:
$nombre = ‘Luis’;
$edad = 25;
$decenios = int $edad/10;
$usuario = $nombre . ‘ ‘ . $apellidos;
Escalares: variables
Imprimiendo variables:
say $nombre
say “$nombre” -> se prefiere la primera ¡hay que escribir menos!
say “$nombre nació en $año”;
$singular = “dedo”;
say “$singulars”; -> no funciona
say “${singular}s” ->este sí
Escalares: comparación
Operación Número Cadena
Igual == eq
Distinto != ne
Menor que < lt
Mayor que > gt
Menor o igual <= le
Mayor o igual >= ge
Escalares: precedencia de operadores
http://perldoc.perl.org/perlop.html
Escalares: if1.if ($nombre gt 'luis') {
2. print "'$name' va después que 'luis'.\n";
3.} else {
4. print "'$name' o va antes que luis 'fred'.\n";5. print "o es la misma cadena\n";
6.}
Escalares: verdadero o falso
Si el escalar es el número 0 es falso, cualquier otro número es verdadero
Si el escalar es una cadena vacía, es falso, cualquier otra cadena es verdadero
Si no es un número o una cadena, convertirlo a cadena o número y volver a intentarlo
Nota: la única cadena que se convierte a falso, además de la cadena vacía es ‘0’
Escalares: entrada
Para leer la entrada estándar usamos el operador <STDIN>
Se puede usar en cualquier lugar en el que perl espere un escalar.
Perl sustituirá el operador <STDIN> por la entrada estándar
$linea = <STDIN>
Escalares: chomp
Toma una cadena como argumento y elimina el retorno de carro (\n)
1.$text = "a line of text\n";
2.chomp($text);
Escalares: while1.$contador = 0;
2.while ($contador < 10) {
3. $contador += 2;
4. print "Contador vale $contador\n";# devuelve 2 4 6 8 10
5.}
El cuerpo del bucle se evalúa cuando la condición es verdadera
Escalares: until1.$contador = 0;
2.untill ($contador == 10) {
3. $contador += 2;
4. print "Contador vale $contador\n";# devuelve 2 4 6 8 10
5.}
El cuerpo del bucle se evalúa cuando la condición es falsa
Ejercicios1. Escribe un programa que calcule el perímetro de una circunferencia de radio 12.5. El
perímetro es 2π veces el radio (π = 3.141592654). La respuesta debe estar entorno a 78.5.
2.Modificar el programa anterior para que el usuario pueda introducir el radio de la circunferencia.
3.Modificar el programa anterior de forma que, si el usuario introduce un número negativo, el perímetro sea cero.
4. Escribe un programa que lee dos números (en dos líneas de texto separadas) y calcula el producto.
5. Escribe un programa que lea una cadena y un número y muestre la cadena repetida en tantas líneas como el número que haya introducido el usuario. Si se introduce Luis y 3 se devolverán tres líneas en las que pone “Luis”. Si se introduce “Luis” y 789979 saldrán muchas líneas