perl1 escalares

74
Programación en Perl para administradores de sistemas

Upload: alfonso-alba

Post on 13-Jun-2015

343 views

Category:

Education


0 download

DESCRIPTION

Diapositivas utilizadas en el curso de introducción a perl.

TRANSCRIPT

Page 1: Perl1 escalares

Programación en Perl para administradores de sistemas

Page 2: Perl1 escalares

¿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

Page 3: Perl1 escalares

¿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)

Page 4: Perl1 escalares

¿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.

Page 5: Perl1 escalares

¿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)

Page 6: Perl1 escalares

¿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...

Page 7: Perl1 escalares

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

Page 8: Perl1 escalares

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

Page 9: Perl1 escalares

...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)

Page 10: Perl1 escalares

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.}

Page 12: Perl1 escalares

Escalares

Page 13: Perl1 escalares

Escalares

Tipo de dato más simple que podemos encontrar en perl

Page 14: Perl1 escalares

Escalares

Tipo de dato más simple que podemos encontrar en perl

Sirve para almacenar “una unidad algo”

Page 15: Perl1 escalares

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.

Page 16: Perl1 escalares

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.

Page 17: Perl1 escalares

Escalares: números

Page 18: Perl1 escalares

Escalares: números

Definición de literal: cómo se representa un valor en el código fuente de perl.

Page 19: Perl1 escalares

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.

Page 20: Perl1 escalares

Escalares: números

Literales en coma flotante

1.25

7.25e45

-15e-10

-1.2E23

Page 21: Perl1 escalares

Escalares: números

Literales de entero

0

2011

-40

8817264612412Este número es un poco difícil de leer ¿verdad?

Page 22: Perl1 escalares

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.

Page 23: Perl1 escalares

Escalares: números

Page 24: Perl1 escalares

Escalares: números

Números en hexadecimal:

0xD4F3

0x1377_0B77

Page 25: Perl1 escalares

Escalares: números

Números en hexadecimal:

0xD4F3

0x1377_0B77

Números en octal:

0377

Page 26: Perl1 escalares

Escalares: números

Números en hexadecimal:

0xD4F3

0x1377_0B77

Números en octal:

0377

Números en binario:

0b111101101

0b111_101_101

Page 27: Perl1 escalares

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)

Page 28: Perl1 escalares

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?

Page 29: Perl1 escalares

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

Page 30: Perl1 escalares

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)

Page 31: Perl1 escalares

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}”

Page 32: Perl1 escalares

Escalares: cadenas

Page 33: Perl1 escalares

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)

Page 34: Perl1 escalares

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

Page 35: Perl1 escalares

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

Page 36: Perl1 escalares

Escalares: operadores de cadenas

Page 37: Perl1 escalares

Escalares: operadores de cadenas

Concatenación: · (punto)

“hola” . ‘ a todos’

“hola a todos” . “\n”

Page 38: Perl1 escalares

Escalares: operadores de cadenas

Concatenación: · (punto)

“hola” . ‘ a todos’

“hola a todos” . “\n”

Repetición de cadena

“Cadena”x3 -> devuelve CadenaCadenaCadena

Page 39: Perl1 escalares

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

Page 40: Perl1 escalares

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

Page 41: Perl1 escalares

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

Page 42: Perl1 escalares

Escalares: conversión automática de tipos

un pequeño test:

Page 43: Perl1 escalares

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;

Page 44: Perl1 escalares

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

Page 45: Perl1 escalares

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

Page 46: Perl1 escalares

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

Page 47: Perl1 escalares

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)

Page 48: Perl1 escalares

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

Page 49: Perl1 escalares

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

Page 50: Perl1 escalares

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)

Page 51: Perl1 escalares

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)

Page 52: Perl1 escalares

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.

Page 53: Perl1 escalares

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)

Page 54: Perl1 escalares

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

Page 55: Perl1 escalares

Escalares: variables

Page 56: Perl1 escalares

Escalares: variables

Almacenan un escalar

Page 57: Perl1 escalares

Escalares: variables

Almacenan un escalar

Comienzan por $ seguido de un identificador:

Page 58: Perl1 escalares

Escalares: variables

Almacenan un escalar

Comienzan por $ seguido de un identificador:

$nombre

Page 59: Perl1 escalares

Escalares: variables

Almacenan un escalar

Comienzan por $ seguido de un identificador:

$nombre

$_nombre

Page 60: Perl1 escalares

Escalares: variables

Almacenan un escalar

Comienzan por $ seguido de un identificador:

$nombre

$_nombre

$apellido1

Page 61: Perl1 escalares

Escalares: variables

Almacenan un escalar

Comienzan por $ seguido de un identificador:

$nombre

$_nombre

$apellido1

$nombre_y_apellidos_del_usuario

Page 62: Perl1 escalares

Escalares: variables

Almacenan un escalar

Comienzan por $ seguido de un identificador:

$nombre

$_nombre

$apellido1

$nombre_y_apellidos_del_usuario

$2nombres -> MAL

Page 63: Perl1 escalares

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;

Page 64: Perl1 escalares

Escalares: variables

Asignando valores:

$nombre = ‘Luis’;

$edad = 25;

$decenios = int $edad/10;

$usuario = $nombre . ‘ ‘ . $apellidos;

Page 65: Perl1 escalares

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í

Page 66: Perl1 escalares

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

Page 67: Perl1 escalares

Escalares: precedencia de operadores

http://perldoc.perl.org/perlop.html

Page 68: Perl1 escalares

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.}

Page 69: Perl1 escalares

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’

Page 70: Perl1 escalares

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>

Page 71: Perl1 escalares

Escalares: chomp

Toma una cadena como argumento y elimina el retorno de carro (\n)

1.$text = "a line of text\n";

2.chomp($text);

Page 72: Perl1 escalares

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

Page 73: Perl1 escalares

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

Page 74: Perl1 escalares

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