• Save
Perl3 subrutinas
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Perl3 subrutinas

  • 1,241 views
Uploaded on

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

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

More in: Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,241
On Slideshare
1,241
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide
  • \n
  • - ¿porqué subrutina y no función? para diferenciar las que son nuestreas de las que ya existen en perl, pero se pueden llamar funciones.\n
  • - ¿porqué subrutina y no función? para diferenciar las que son nuestreas de las que ya existen en perl, pero se pueden llamar funciones.\n
  • - ¿porqué subrutina y no función? para diferenciar las que son nuestreas de las que ya existen en perl, pero se pueden llamar funciones.\n
  • - algunos las ponen arriba y otros abajo para que se ve la parte principal del script en primer lugar\n
  • Ejecutar el script marineros.pl\n
  • \n
  • Hacer el ejemplo retorno1.pl\n
  • ¿Qué nos va a salir por pantalla?\n
  • ejecutar retorno2.pl\n
  • \n
  • retorno3.pl\n
  • \n
  • \n
  • \n
  • Mostrar ahora el ejemplo argumentos1.pl (se muestra en la siguiente transparencia)\n
  • \n
  • \n
  • \n
  • variables_privadas1.pl\nResaltar que los valores de $a y $b ahora no se cambian, si no hacemos lo del my, sí que se cambian.\n
  • \n
  • \n
  • \n
  • argumentos_variables1.pl \nargumentos_variables2.pl\n\nMostrar el código de argumentos_variables2.pl y explicarlo. Cosas importantes que contar aquí:\n- uso de variables por defecto\n- uso del shift para vaciar el array de argumentos, muy común\n\n¿Qué ocurre a la función anterior si recibe una lista vacía? -> que devolverá un undef\n
  • Poner dos ejemplos: variables_privadas2.pl\n $cuadrado = 10;\nsay "\\$cuadrado antes vale $cuadrado";\nforeach (1..10) {\n  my($cuadrado) = $_ * $_;\n  print "$_ al cuadrado es $cuadrado.\\n"; \n}\nsay "\\$cuadrado después vale $cuadrado";\n\nPoner dos ejemplos: variables_privadas3.pl\n$cuadrado = 10;\nsay "\\$cuadrado antes vale $cuadrado";\n{\n  my($cuadrado) = "C U A D R A D O";\n  print "\\$cuadrado dentro es $cuadrado.\\n"; \n}\nsay "\\$cuadrado después vale $cuadrado";\n
  • ¿Qué problema tiene no usar my?\n\npones una variable $error = 20 y 10000 líneas más abajo escribes:\n\nif ($erro > 0) {BLABLABLA}\n\nLa liaste porque el intérprete crea la variable $erro por tí y le signa un certo así que este if siempre será falso.\n\nCon use strict esto da un error.\n
  • \n
  • Learning perl 6th ed. Página 76\n\nEjercicio: hacer una función que arregle el problema del rango ( el operador .. sólo funciona cuando el primer operando es menor que el segundo )\ndevolver_array.pl ->\nsub rango {\n    my ($a,$b) = @_;\n    if ($a > $b) {\n        $b..$a;\n    } else {\n        $a..$b;\n    }\n}\n \n$a = 10;\n$b = 30;\n \n@lista = &rango(10, 30);\n \nsay "@lista"\n
  • \n
  • ver ejemplo wantarray.pl\n
  • \n
  • \n

Transcript

  • 1. Programación en Perl Subrutinas / funciones
  • 2. Definir una subrutina1.sub marineros {2.    $n += 1; # Global variable $n3.    print "¡Hola marinero $n!n";4.}
  • 3. Definir una subrutina Palabra Nombre de lareservada sub subrutina 1.sub marineros { 2.    $n += 1; # Global variable $n 3.    print "¡Hola marinero $n!n"; 4.}
  • 4. Definir una subrutinaLa subrutina puede estar en cualquier parte delfichero.La definición de subrutinas es global: una vez definidasse pueden usar desde cualquier parte o ficherodurante la ejecución del script.Si dos subrutinas tienen el mismo nombre, se aplica laúltima que se lee En este caso se lanza un warning.Todas las variables definidas hasta ahora son globales.
  • 5. Llamar a una subrutina1.&marineros Se llama al nombre de la función con un & delante
  • 6. Retorno de valoresTodas las funciones en perl deben devolver algoSIEMPREPerl devuelve por defecto el valor de la últimaexpresión evaluada dentro de la subrutina.
  • 7. Retorno de valores1.$a = 10;2.$b = 20;3.sub funcion1 {4.    say "Dentro de función 1";5.    $a + $b;6.}7. 8.say "funcion1: ",&funcion1;
  • 8. Retorno de valores1.$a = 10;2.$b = 20;3.sub funcion2 {4.    say "Dentro de función 2";5.    $a + $b;6.    say "Aquí imprimimos algo";7.}8.say "funcion2: ",&funcion2
  • 9. Retorno de valores1.$a = 10;2.$b = 20;3.sub funcion2 {4.    say "Dentro de función 2";5.    $a + $b;6.    say "Aquí imprimimos algo";7.}8.say "funcion2: ",&funcion2 ------- funcion2: 1
  • 10. Retorno de valoresSe devuelve el resultado de la última expresiónevaluada.La última expresión evaluada es print, por loque se devuelve el resultado de evaluar printEl 1 significa que el print se evaluócorrectamente.
  • 11. Retorno de valores1.$a = 10;2.$b = 20;3.sub maximo {4.  if ($a > $b) {5.    $a;6.  } else {7.    $b;8.  }9.}10. 11.say "maximo: ",&maximo
  • 12. Argumentos
  • 13. ArgumentosNuestras subrutinas son muy poco prácticas ydifíciles de mantener: tenemos que definirconstantemente variables globales para poderusarlas.
  • 14. ArgumentosNuestras subrutinas son muy poco prácticas ydifíciles de mantener: tenemos que definirconstantemente variables globales para poderusarlas....pero perl permite pasar una LISTA deargumentos a una función
  • 15. ArgumentosNuestras subrutinas son muy poco prácticas ydifíciles de mantener: tenemos que definirconstantemente variables globales para poderusarlas....pero perl permite pasar una LISTA deargumentos a una funcióninsisto: LISTA de argumentos
  • 16. Argumentos Así llamamos a una función y le pasamos una lista de argumentos1. $max = &maximo(10, 50); Perl almacena la lista que recibe como argumento en el array @_ Reescribamos nuestra función maximo:
  • 17. Argumentos1.$a = 10;2.$b = 20;3.sub maximo {4.  if ($_[0] > $_[1]) {5.    $_[0];6.  } else {7.    $_[1];8.  }9.}10. 11.say "maximo: ",&maximo($a, $b) ...un poco complicada de leer. En seguida veremos como mejorar esto.
  • 18. Argumentos: @_@_ es una lista privada dentro de la función: siesta lista tenía un valor antes de la llamada,este valor se guarda y el intérprete lo recuperacuando se sale de la subrutina.Si esto no fuese así, sería complicado anidarsubrutinas.Incluso en subrutinas recursivas, cada llamadatiene su propia copia de la lista @_.
  • 19. Variables privadas Por defecto, perl siempre trabaja con variables globales. Perl permite crear variables privadas o “variables léxicas” (lexical variables) a través del operador my.1.sub max {2.   my($m, $n); # variables privadas: válidas sólo en este #bloque de código3.  ($m, $n) = @_; # asignamos valores a las variables4.  if ($m > $n) {5.    $m6.  } else {7.    $n8.  }9.}
  • 20. Variables privadas Escribimos una versión más legible de nuestra función maximo1.$a = 100;2.$b = 200;3.sub maximo {4.  my($a,$b);5.  ($a, $b) = @_;6.  if ($a > $b) { $a; } else { $b; }7.}8. 9.say "maximo: ",&maximo(10, 20);10.say "maximo: ",&maximo($a, $b)
  • 21. Número variable de argumentos
  • 22. Número variable de argumentosLas funciones en perl reciben una lista deargumentos por lo tanto ¿cuántos argumentospuede recibir una función en perl?
  • 23. Número variable de argumentosLas funciones en perl reciben una lista deargumentos por lo tanto ¿cuántos argumentospuede recibir una función en perl? 2147483647, es decir, máximo número de índices que puede tener un array
  • 24. Número variable de argumentosLas funciones en perl reciben una lista deargumentos por lo tanto ¿cuántos argumentospuede recibir una función en perl? 2147483647, es decir, máximo número de índices que puede tener un arrayDebemos, por tanto, controlar el número deargumentos que recibimos
  • 25. Argumentos: ejerciciosmodificar la función máximo anterior para quemuestre un aviso por pantalla cuando se recibenmás de 2 argumentos.escribir una función maximo que acepte unnúmero arbitrario de argumentos
  • 26. Más sobre variables privadas Las variables privadas se pueden definir en cualquier bloque de código:1. $cuadrado = 10;2. say "$cuadrado antes vale $cuadrado";3. foreach (1..10) {4.   my($cuadrado) = $_ * $_;5.   print "$_ al cuadrado es $cuadrado.n";6. }7. say "$cuadrado después vale $cuadrado"; 1. $cuadrado = 10; 2. say "$cuadrado antes vale $cuadrado"; 3. { 4.   my($cuadrado) = "C U A D R A D O"; 5.   print "$cuadrado dentro es $cuadrado.n"; 6. } 7. say "$cuadrado después vale $cuadrado";
  • 27. Más sobre variables privadasPerl tiende a ser un lenguaje muy permisivo.Podemos imponer cierta disciplina con el uso del pragma usestrict.¿Qué hace este pragma? impone restricciones: nos obliga a declarar todas las variables con my. más restricciones: perldoc strict.A partir de la versión 5.12 de perl, se usa strict por defecto, asíque si usamos use 5.012 no tenemos que usar use strict.Consejo: usar siempre use strict (a no ser que tengáis un buenmotivo para no usarlo... y normalmente no lo tendréis)
  • 28. ReturnNos permite salir de la subrutina devolviendo unvalor determinado.
  • 29. Devolviendo valores no escalares Si se llama a una función en un entorno de lista, puede devolver una lista de valores1.sub rango {2.    my ($a,$b) = @_;3.    if ($a > $b) {4.        $b..$a;5.    } else {6.        $a..$b;7.    }8.}9.$a = 10;10.$b = 30;11.@lista = &rango(10, 30);
  • 30. Devolviendo valores no escalaresLa función wantarray devuelve true en uncontexto de lista y false en un contexto escalar.
  • 31. Devolviendo valores no escalares1.sub rango { La función want array devuelve true en2.    my ($a,$b) = @_; un3.    if (wantarray) {4.      contexto > $b) { y false en un contexto   if ($a de lista escalar.5.            $b..$a;6.        } else {7.            $a..$b;8.        }9.    } else {10.        return abs($a - $b);11.    }12.}13.$a = 10;14.$b = 30;15.@lista = &rango($a, $b);16.$escalar = &rango ($a, $b);17.say "@lista = @lista";18.say "$escalar = $escalar";
  • 32. stateSi definimos una variable como state dentro deuna subrutina, perl guarda el valor de la mismaentre sucesivas llamadas a una función(es como una variable static)Disponible a partir de la versión 5.10 de perl
  • 33. Ejercicios1. Escribe una subrutina en perl que acepte una lista de números y calcule la suma. Hacerla de forma que a medida que se llama a la función para sumar números, esta almacena la suma acumulada en las diferentes llamadas: acumula (1,2,3) -> 6 acumula (4,5) -> devuelve 6+9=152. Modificar la función anterior para resetear el valor acumulado y ponerlo a cero cuando se le pasa como argumento una lista vacía.3. Modificar la función anterior para que, al usarse en un entorno escalar, devuelva el valor acumulado.