Las subrutinas de Perl también son funciones definidas por el usuario.
Una subrutina Perl es una pieza de código separada que realiza una tarea específica, lo que puede reducir el código repetitivo y hacer que el programa sea más fácil de leer.
Las subrutinas de Perl pueden aparecer en cualquier parte del programa y el formato de sintaxis es el siguiente:
sub subrutina {declaraciones;}
Formato de sintaxis para llamar a subrutina:
subrutina(lista de parámetros);
En versiones inferiores a Perl 5.0, el método para llamar a una subrutina es el siguiente:
&subrutina(lista de parámetros);
En la nueva versión, aunque este método de llamada también es compatible, no se recomienda su uso.
A continuación veamos un ejemplo sencillo:
Al ejecutar el programa anterior, el resultado de salida es:
¡Hola Mundo!
Los subprogramas de Perl pueden aceptar múltiples parámetros, al igual que otros parámetros de programación están marcados con la matriz especial @_.
Por lo tanto, el primer parámetro de la subrutina es $_[0], el segundo parámetro es $_[1], y así sucesivamente.
Independientemente de si los parámetros son escalares o de matriz, cuando el usuario pasa los parámetros a la subrutina, Perl los llama por referencia de forma predeterminada.
Al ejecutar el programa anterior, el resultado de salida es:
Los parámetros pasados son: 10 20 30 El valor del primer parámetro es: 10 El valor medio de los parámetros pasados es: 20
Los usuarios pueden cambiar el valor del parámetro real correspondiente cambiando el valor en la matriz @_.
Dado que la variable @_ es una matriz, se puede pasar una lista a la subrutina.
Pero si necesitamos pasar parámetros escalares y de matriz, debemos colocar la lista en el último parámetro, como se muestra a continuación:
El programa anterior combina escalares y matrices, y el resultado es:
La lista es: 10 1 2 3 4
Podemos pasar múltiples matrices y hashes a la subrutina, pero al pasar múltiples matrices y hashes, se perderán las identidades independientes. Por lo tanto, necesitamos usar referencias (se presentarán en el próximo capítulo) para aprobar.
Cuando se pasa una tabla hash a la subrutina, se copia en @_ y la tabla hash se expande en una lista de combinaciones clave/valor.
El resultado de salida de la ejecución del programa anterior es:
edad: 3nombre: codercto
Las subrutinas pueden devolver valores de funciones utilizando la declaración de devolución como en otros lenguajes de programación.
Si no se utiliza ninguna declaración de retorno, la última línea de la subrutina se utiliza como valor de retorno.
El resultado de salida de la ejecución del programa anterior es:
3
Podemos devolver escalares, matrices y hashes en subrutinas, pero al devolver múltiples matrices y hashes, se perderán identidades independientes. Por lo tanto, necesitamos usar referencias (introducidas en el próximo capítulo) para devolver múltiples matrices y funciones.
De forma predeterminada, todas las variables en Perl son variables globales, lo que significa que se pueden llamar a las variables en cualquier parte del programa.
Si necesitamos configurar una variable privada, podemos usar el operador my para configurarla.
El operador my se utiliza para crear variables de ámbito léxico. Las variables creadas a través de my sobreviven desde el principio de la declaración hasta el final del ámbito cerrado.
El alcance cerrado se refiere al área dentro de un par de llaves, un archivo o una cadena if, while, for, foreach o eval.
El siguiente ejemplo demuestra cómo declarar una o más variables privadas:
sub somefunc { my $variable; # $variable no es visible fuera del método somefunc() my ($another, @an_array, %a_hash);
El resultado de salida de la ejecución del programa anterior es:
Cadena dentro de la función: Hola Codercto! Cadena fuera de la función: ¡Hola Mundo!
Podemos usar local para proporcionar valores temporales para variables globales y devolver los valores originales después de salir del alcance.
Las variables definidas por local no existen en el programa principal, pero sí en el subprograma y en los subprogramas llamados por el subprograma. Puedes asignarle un valor al definirlo, como por ejemplo:
El resultado de salida de la ejecución del programa anterior es:
Valor de cadena dentro de la función PrintMe: Hola, Codercto!PrintCodercto Valor de cadena dentro de la función: Hola, Codercto!PrintHello Valor de cadena dentro de la función: Hola, Mundo Valor de cadena fuera de la función: ¡Hola, Mundo!
La función del operador de estado es similar al modificador estático en C. La palabra clave de estado hace que las variables locales sean persistentes.
El estado también es una variable léxica, por lo que solo es válido en el ámbito léxico en el que se define la variable.
El resultado de salida de la ejecución del programa anterior es:
El valor del contador es: 0 contador El valor es: 1 contador El valor es: 2 contador El valor es: 3 contador El valor es: 4
Nota 1: el estado solo puede crear variables cuyo alcance cerrado esté dentro de la subrutina.
Nota 2: el estado se introdujo desde Perl 5.9.4, por lo que se debe agregar el uso antes de usarlo.
Nota 3: el estado puede declarar escalares, matrices y hashes. Pero las matrices y los hashes no se pueden inicializar cuando se declaran (al menos no en Perl 5.14).
Durante el proceso de llamada a la subrutina, se devolverán diferentes tipos de valores según el contexto. Por ejemplo, la siguiente subrutina localtime() devuelve una cadena en un contexto escalar y una lista en un contexto de lista:
El resultado de salida de la ejecución del programa anterior es:
dom 12 jun 15:58:09 20162106-6-12 15:58:9