Perl1 escalares

Preview:

DESCRIPTION

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

Citation preview

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

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

Recommended