1 / 38

Programación II

8 – Perl. Programación II. Ing. Diego J. Arcusin info@digikol.com.ar. Introducción. Perl - "Practical Extraction and Report Language“ Es un lenguaje surgido de otras herramientas UNIX como sed, grep, awk y los Shells.

rasha
Télécharger la présentation

Programación II

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 8 – Perl Programación II Ing. Diego J. Arcusin info@digikol.com.ar

  2. Introducción • Perl - "Practical Extraction and Report Language“ • Es un lenguaje surgido de otras herramientas UNIX como sed, grep, awk y los Shells. • Sirve principalmente para el procesamiento de texto y para programación en general. • Actualmente se encuentra consolidado como uno de los lenguajes más utilizados para el desarrollo de aplicaciones para la Web. • Para correr un programa perl: perl –e ‘print “Hola Mundo\n”; perl programaperl.pl • Para visualizar los warnings se utiliza la opción -w

  3. Primer Programa $ cat miprograma.pl #!/usr/bin/perl -w # Este es mi primer programa en perl use strict; print "Hola, Mundo!\n"; • La primera línea indica la ruta al intérprete perl. • La segunda incorpora un comentario. Todo lo que se encuentre a la derecha de “#” será ignorado por el intérprete. • La tercera línea exige que todas las variables sean declaradas. (Recomendable para programar mejor). • La tercera línea imprime Hola, Mundo! y un caracter nueva línea. • En general todas las líneas de un programa deben finalizar con el caracter “;”. • Si al programa se le dan permisos de ejecución, el mismo se puede ejecutar directamente. Por ejemplo: $ ./miprograma.pl

  4. Variables Escalares (Scalars). • Los escalares son variables del tipo “Número” o “Cadena”, comienzan siempre con el caracter “$”. Por ejemplo: $minumero = 1;$mitexto = ‘Hola Mundo’; • Para declarar variables (Escalar o de cualquier otro tipo) se utiliza “my”. Por ejemplo: my $contador = 1; • El operador es quien determina si el escalar es un número o una cadena. • Para “parsear” el valor de un Escalar se utiliza comillas dobles. Por ejemplo: my $total = 100; print “El valor es $total”; # Despliega: El valor es 100 • Para evitar el parseo de un Escalar se utilizan comillas simples.Por ejemplo: my $total = 100; print ‘El valor es $total’; # Despliega: El valor es $total

  5. Variables (cont.) Arreglos (Arrays). • Son vectores de Escalares. • Comienzan con el caracter “@”. Por ejemplo: my @nombres; $nombres[0]=‘Carlos’; $nombres[1]=‘María’; $nombres[2]=‘Juan’; $nombres[3]=‘Laura’; • Si bien @nombres es un array, cada uno de sus elementos es un escalar. Por eso cada una de las asignaciones empieza con “$”. • Otra forma de asignar el arreglo es: my @nombres = (‘Carlos’, ‘María’, ’Juan’, ‘Laura’); • En el ejemplo anterior se utiliza un Lista para asignar al array sus valores. Un List es una lista de uno o más escalares, separados por coma.

  6. Variables (cont.) • La función “push” permite agregar valores a un arreglo y recibe como parametros un array y una lista: push ARRAY, list. Por ejemplo: push @nombres, (‘Pedro’, ‘Marcela’, ‘Oscar’); • Un arreglo entre paréntesis actúa como una lista. Por ejemplo: @nombres = (@familiares, @amigos, @otros); • Un arreglo también permite asignar valores a una lista. Por ejemplo: ($papa, $mama, $tio, $tia) = @nombres; • El tamaño del array se obtiene asignando el array a un escalar. Por ejemplo: my $cantarray = @nombre;

  7. Variables (cont.) Hashes (Arreglos Asociativos) • Son como arreglos de Escalares pero utilizando una cadena para sus índices (llamadas KEYS) en lugar de un número. • Comienzan con un “%”. • Los Hashes utilizan { } para encerrar cada KEY, a diferencia de los [ ] utilizados en los arreglos. • A diferencia de los arreglos, un Hash no puede ser interpretado como un lista. Por lo que no se puede utilizar como argumento de la función push. • Cada elemento de un HASH consiste de un KEY y un VALUE • Para acceder a lista de los indices de un HASH se utiliza la función keys.

  8. Variables (cont.) my %cenas; $cenas{‘Lunes’}=‘Pollo’; $cenas{‘Martes’}=‘Carne’; $cenas{‘Miercoles’}=‘Ensalada’; $cenas{‘Jueves’}=‘Arroz’; $cenas{‘Viernes’}=‘Pasta’; # Para desplegar todos los keys en una sola línea: print keys %cenas, “\n” # Para ver los pares uno por uno foreach my $dia (keys %cenas) { my $comida = $cenas{$dia}; print “El dia $dia como $comida.\n”; } • Si bien %cenas es un HASH, cada uno de sus valores es un escalar. Por eso al asignarlo se utiliza el caracter “$”.

  9. Variables (cont.) • Un asignación de Hash mas legible. my %cenas = ( lunes => ‘Pollo’, Martes => ‘Carne’, Miercoles => ‘Ensalada’, Jueves => ‘Arroz’, Viernes => ‘Pasta’, ); • La última asignación puede o no terminar con ,

  10. Subrutinas y Funciones • No existen diferencias sustanciales entre una subrutina (definida por el programador) y una función (predefinida en PERL). • En forma opcional las subrutinas pueden ser invocadas con un &. • El tipo de dato de la subrutina / función está dado por el valor que devuelve dicha subrutina / función. • Las subrutinas empiezan con la palabra “sub”, y el valor se devuelve con la instrucción “return”. • Los argumentos recibidos por la subrutina se encuentran en el Array @_ • También se pueden obtener los argumentos de a uno mediante la instrucción “shift”. • Ejemplos:# Esta subrutina devuelve un escalar.sub ReturnScalar { my $first_argument = shift; return "El argumento es: $first_argument"; }

  11. Subrutinas y Funciones (cont.) • Ejemplos:# Esta subrutina devuelve un Array.sub ReturnArray { my $array_size = shift; my @array = (); for (my $i=0; $i < $array_size; $i++ ) { $array[$i] = “El valor es $i”; } return @array; } # Esta Rutina recibe tres argumentos y los muestra sub MuestraTresArgs { my ($arg2, $arg2, $arg3) = @_; print “Los valores son: $arg1 - $arg2 - $arg3”; }

  12. Subrutinas y Funciones (cont.) • Ejemplos de uso de subrutinas:# Ejemplo de Uso de ReturnScalarprint "Scalar:\n"; print ReturnScalar('test 1'), "\n", ReturnScalar('test 2'), "\n"; • # Ejemplo de Uso de ReturArrayprint "Array:\n"; my @test_array = returnArray(5); for (my $i = 0; $i <= @test_array - 1; $i++) { print "$test_array[$i]\n"; } • Cuando se corre un programa desde la línea de comandos, se puede interpretar como una subrutina.La única diferencia es que se usa el array @ARGV en vez de @_ para la recepción de los parámetros de la línea de comandos.

  13. References • Los References en Perl son como los punteros en C. • Apuntan a una dirección de memoria donde se almacena el valor de una variable. • Si bien se pueden hacer referencias a cualquier tipo de variable, la referencia en si se trata siempre como un Escalar por lo que comienzan con $. • Para crear una referencia a una variable se usa. • Ejemplos: # Crear referencias my $scalar = 'hola'; my $scalar_ref = \$scalar; print "Scalar: $$scalar_ref\n";

  14. References (cont.) my @arr = (1, 2, 3); my $arr_ref = \@arr; print "Array: @$arr_ref\n"; my %hash = ( nombre => 'Carlos', apellido => 'Sanchez', edad => 25, ); my $hash_ref = \%hash; print "Hash size: ", scalar(keys %$hash_ref), "\n"; • Una subrutina que devuelve un array o un hash muy grande es ineficiente. Es más eficiente devolver una referencia al array o al hash.

  15. References (cont.) • Se puede crear una referencia a una lista usando [ ]en lugar de ( ). Por ejemplo: # Referencia a una lista my $ref_a_arreglo = [ 'a0', 'a1', 'a2' ]; print "$ref_a_arreglo->[1]\n"; • Mediante esta técnica se pueden implementar arreglos multidimensionales. # Referencia a una lista de listas (o sea, un array multi-dimension) my $ref_a_multi_arreglo = [ [ 'a0', 'a1', 'a2' ], [ 'b0', 'b1', 'b2', 'b3' ], [ 'c0', 'c1', 'c2' ], ]; # Desplegar elemento (1,3) = 'b3' print "$ref_a_multi_arreglo->[1][3]\n";

  16. Verdadero / Falso • En Perl los valores verdadero y falso se evalúan siempre como un Escalar y mediante las siguientes reglas: • Una cadena siempre es verdad, menos las cadenas “” y “0” • Un número siempre es verdad, menos el número 0 • Una referencia siempre es verdad • Un valor no definido siempre es falso • Ejemplos: 0 # Como la cadena "0" - falso 1 # Como la cadena "1" - verdad 10 - 10 # Igual a 0, como la cadena "0" - falso 0.00 # Como número evalua a 0, como la cadena "0" - falso "0.00" # No igual a la cadena "0" - verdad "0.00" + 0 # Evalua a 0 - falso "" # NULL - falso \$ref # Una referencia contiene la dirección adonde apunta, # siempre <> 0 - verdad undef() # Devuelve un valor no definido - falso

  17. Operadores Numéricos • Iguales a los de cualquier lenguaje: + - * / % ** • Ejemplos: • $a = 1; • $b = '3' + $a; # $b = 4 • $b *= 5; # $b = 20 • $c = $b % 3; # $c = 2 • $d = $b ** 2; # $d = 400

  18. Operadores (cont.) Cadenas • $a = ‘Hola Mundo’; • $b = ‘Que tal?’; • $c = $a . ‘ ‘ . $b # $c = “Hola Mundo Que tal?” # El operador “.” concatena • $d = ‘chau ’; • $e = $dx 4; # $e = “chau chau chau chau ” # El operador x copia n instancias de la cadena

  19. Operadores (cont.) Lógicos • “||” o “or” # Operador lógico “o” • “&&” o “and” # Operador lógico “y” • “!” o “not” # Operador lógico “no” • Los operadores de C && || !son iguales de los más legibles and, or, not.La única diferencia es que and, or y not tienen menor precedencia al momento de la evaluación. • al igual que en cualquier lenguaje para forzar la precedencia en la evaluación lógica se utilizan los paréntesis. Incremento y Decremento • “++” o “- -” • $b = $a ++; # Esto es lo mismo que $b = $a; $b = $b + 1; Comparación • == != < > <= >= # Operadores aplicables a números • eq ne lt gt le ge # Operadores aplicables a cadenas.

  20. Operadores (cont.) Ejemplos de Operadores Lógicos $a = '0'; $b = $a || 2;# Como $a evalúa a "0" (falso), # se evalúa la parte derecha de ||, $b = 2 $b = ($a || 2); # Igual que el ejemplo anterior (paréntesis opcionales) $b = ($a or 2); # Igual que el ejemplo anterior (paréntesis requeridos) $a = '3'; $b = $a || 2; # Como $a evalúa a "3" (verdad), # se ignora la parte derecha de ||, $b = 3 $b = ($a || 2); # Igual que el ejemplo anterior $b = ($a or 2); # Igual que el ejemplo anterior $a = '0'; $b = $a && 2; # Como $a evalúa a "0" (falso), # se ignora la parte derecha de &&, $b = 0 $b = ($a && 2); # Igual que el ejemplo anterior $b = ($a and 2); # Igual que el ejemplo anterior $a = '3'; $b = $a && 2; # Como $a evalúa a "3" (verdad), # se evalúa la parte derecha de ||, $b = 2 $b = ($a && 2); # Igual que el ejemplo anterior $b = ($a and 2); # Igual que el ejemplo anterior

  21. Operadores (cont.) Ejemplos de Operadores Incremento y Decremento $a = 1; $b = $a++; # $a=2, $b=1 $c = ++$a; # $a=3, $c=3 $d = 5; $e = $d--; # $d=4, $e=5 $f = --$d; # $d=3, $e=5, $f=3

  22. Control de Flujo Condiciones • if, else, elsif, unless, while, until Ejemplos: if ($edad < 18) { print "Joven\n"; } elsif ($edad < 65) { print "Adulto\n"; } else { print "Viejito ;-)\n"; } while ($contador < 1000) { $contador ++; } print “Llegue a 1000!\n";

  23. Control de Flujo - Condiciones if, else, elsif, while Ejemplos: if ($edad < 18) { print "Joven\n"; } elsif ($edad < 65) { print "Adulto\n"; } else { print "Viejito ;-)\n"; } while ($contador < 1000) { $contador ++; } print “Llegue a 1000!\n";

  24. Control de Flujo - Condiciones unless, until • unless es la negación de if • until es la negación de while. Ejemplos: • unless ($edad >= 18) ... # igual que if ($edad < 18) • until ($contador >= 1000) ... # igual que ($contador < 1000) Perl también permite incorporar condiciones de la siguiente forma: • print "Hoy es lunes\n" if ($weekday eq 'lunes');

  25. Control de Flujo - loops for • Se utiliza para obtener un índice específico. Ejemplo: for (my $i = 0; $i <= @array; $i++) { if ($i == 123) {print “Este es el elemento 123\n";} }

  26. Control de Flujo - loops foreach • El foreach se utiliza para procesar todo los elementos de un array o un hash. Ejemplo: foreach my $dia (keys %cenas) { my $comida = $cenas{$dia}; print “El dia $dia como $comida.\n”; }

  27. Control de Flujo - loops • En Perl el next y last son instrucciones válidas dentro de un loop foreach o for. Ejemplos: for (my $i = 0; $i <= @array; $i++) { # Ignore index less then 100 and index 5000 if ($i < 100 or $i == 5000) {next;} # Exit loop when found a special case if ($array[$i] == '999') {print "Found at $i!\n"; last;} }

  28. Control de Flujo – select / case • Perl no cuenta con un comando tipo select o switch.Una forma posible para emular una instrucción de este tipo es: for ($marca) { /Mercedes/ and do { print “OK, pero caro!\n"; last; } ; /Volvo/ and do { print "Un poco viejo...\n"; last; } ; /Peugeot/and do { print "No tan mal...\n"; last; } ; print "El Auto $marca no conozco.\n"; }

  29. Archivos open, read, print, close • Ejemplo de lectura de un archivo a una variable escalar. open(FH, '</var/log/messages'); read(FH, my $contents, 10000); # Leer maximo 10000 bytes close(FH); print $contents; • También es posible cargar el archivo en un arreglo, una linea por elemento: open(FH, '</var/log/messages'); my @contents = <FH>; # Todo el archivo va al arreglo close(FH); foreach my $line (@contents) { print "$line"; }

  30. Archivos (cont.) • Para escribir a un archivo: open(FH, '>/tmp/test'); print FH "Esto escribo al archivo /tmp/test\n"; close(FH); • Para agregar al final de un archivo: open(FH, '>>/tmp/test'); print FH "Esto agrego al final del archivo /tmp/test\n"; close(FH);

  31. Archivos (cont.) • Perl utiliza sintáxis similar al comando UNIX “test” para hacer pruebas sobre los archivos.Por ejemplo: if (-f $filename) ... # Verdadero si el archivo existe # y es u archivo regular • Para borrar un archivo:unlink $filename;

  32. Expresiones Regulares • $variable =~ m/ExprReg/ Esta expresión será verdadera si se encuentra el patrón ExprReg en $variable. • $variable !~ m/ExprReg/ Esta expresión será verdadera si NO se encuentra el patrón ExprReg en $variable. • $variable =~ s/ExprReg1/ ExprReg2/ Se sustituye el patrón ExprReg1 por el patrón ExprReg2 en $variable.

  33. Expresiones Regulares (cont.) Ejemplos: my $saludo = ‘Hola que tal!'; # Match using 'm//' if ($saludo =~ m/Hola/) { print “Encontré ‘Hola' en '$saludo'\n"; } # Substitute using 's///' $saludo =~ s/Hola/Buenas/; if ($saludo =~ m/Hola/) { print “Encontré ‘Hola' en '$saludo'\n"; } if ($salud !~ m/Hola/) { print “No volví a encontrar 'Hola' en '$saludo'\n"; }

  34. Expresiones Regulares (cont.) • El Perl permite el uso de los siguientes metacaracteres:\ Para podear matchear a otro metacaracter. Ej: \*| O logico. ( ) Agrupador lógico [ ] Opciones o intervalos de caracteres ^ Matchea al inicio de la cadena. $ Matchea al final de la cadena. *+? Operadores “cerradura” . Matchea una instancia de cualquier caracter. { } Cuantificadores. {n,m} Se requieren como mínimo n matches y como máximo m {n,} Se requieren como mínimo n matches. (Sin máximo) {n} Se requieren exactamente n matches.

  35. Expresiones Regulares (cont.) El Perl también permite el uso de los siguientes caracteres especiales: \t Tabulación \n Nueva línea \d Matchea a un dígito. Equivalente a /[0-9]/ \D Matchea cualquier caracter que no sea un dígito \s Matchea un caracter de espacio (espacios, tabs, nueva línea, etc) \S lo opuesto de \s \w Matchea un caracter alfanumérico. Equivalente a /[a-zA-Z_0-9]/

  36. Expresiones Regulares (cont.) • Los siguientes operadores se agregan al final de las instrucciones. Ejemplo: s/Hola/Chau/g e La cadena de sustitución se evalúa. Permite la utilización de funciones. Por ejemplo: $variable =~ s/Rojo/&ColoralAzar()/e Sustituye la cadena ‘Rojo’ por lo que devuelve la función ColoralAzar(). g Sustituye globalmente (todos los matches de la línea). i insensitive. Matchea indistintamentemayúsculas o minúsculas. m multiple. Si la cadena contiene \n trata la cadena como varias líneas. s single. Aunque la cadena contenga \n, la trata como una única líneas. Nota: m y s modifican el comportamiento de ^ y $. Ejemplos:

  37. Preguntas ?

  38. Ejercicios 8.1. Desarrolle un dado en Perl qué genere números al azar entre 1 y 6. Utilice la función: rand (perldoc –f rand) 8.2. Crear un programa que pida por pantalla una línea del tipo:key1=value1luego deberá separar el key del value.Utilice: print "Ingresar: "; chomp(my $input = <STDIN>);y la función split 8.3. Desarrolle un programa que pida 5 números desde el teclado, y que los ordene en forma ascendente.Utilice las funciones push y sort

More Related