Subrutinas
Table of contents
- Uso de argumentos
- Subrutinas anonimas
- Subrutinas con parametro opcional
- Subrutinas con subrutinas y bloques anonimos
Se declaran poniendo la palabra sub
de la siguiente forma:
sub imprimir{
print "Ola\n";
}
Uso de argumentos
Para pasar argumento se puede hacer usando un arreglo predefinido: @_
sub argumentos{
my ($argumento_1, $argumento_2) = @_;
print "$argumento_1 $argumento_2";
}
En este caso $argumento_1
es el primer elemento del arreglo, y argumento_2
es el segundo, y debido a que es un arreglo, el primer argumento de la función está en $_[0]
, el segundo está en $_[1]
, y así sucesivamente.
Si no se desea hacer tan explicita la declaración de los argumentos, se puede trabajar directamente con @_
(solo aplicaria para funciones cortas o funciones anonimas)
sub argumentos{
print $_[0] + $_[1];
}
argumentos(1, 2);
Pasando un arreglo como parametro
sub arreglo{
my (@nombre) = @_;
for (@nombre){
print "$_\n";
# $res .= "$_\n"; concatena el valor de cada elemento en "res"
}
#return $res;
}
my @mi_arreglo = ("uno", "dos", "tres");
arreglo(@mi_arreglo);
Pasando un hash como parametro
sub print_hash {
my (%hash) = @_;
foreach my $clave ( keys %hash ) {
my $valor = $hash{$clave};
print "$key : $valor\n";
#$res .= "$key : $value\n";
}
#return $res;
}
%hash = ('name' => 'Tom', 'age' => 19);
print_hash(%hash);
Subrutinas anonimas
Es una funcion que se define sin asignarle un nombre especifico, tambien son conocidas como funciones lambda
my $saludo = sub {
my ($nombre) = @_;
return "Hola, $nombre!";
};
print $saludo->("Juan");
Se usa ->
ya que se debe de hacer la referencia para invocar a la funcion
Subrutina que retorna una funcion anonima
#!/usr/bin/env perl
sub multiplicar{
my ($numero_1) = @_;
return sub {
my ($numero_2) = @_;
return $numero_1 * $numero_2;
}
}
my $resultado = multiplicar(2);
print $resultado->(5);
- La funcion
multiplicar
recibe como argumento$numero_1
- La funcion
multiplicar
retorna una funcion anonima que recibe como argumento$numero_2
, esa funcion anonima retorna la multiplicación de$numero_1
y$numero_2
- La variable
$resultado
solo tiene la referencia la funcion anonima - Cuando se usa
$resultado->(5)
se esta llamando a la funcion anonima, y entonces5
es el argumento$numero2_
de la función anonima
Subrutinas con parametro opcional
La idea de poner una subrutina con un parametro opcional es indicar que si no es especifica nigun parametro, tome uno por defecto
sub opcional {
my ($numero) = @_;
my $default = 5;
if ($numero eq undef){
$numero = $default;
}
return $numero;
}
print opcional();
Se define el parametro $numero
y la variable $default
, luego en el if se compara si $numero
es indefinido (undef
), si no tiene ningun valor, a $numero
se le asigna el valor de $default
Subrutinas con subrutinas y bloques anonimos
#!/usr/bin/env perl
sub area_cuadrado {
my ($lado_1, $lado_2) = @_;
{
sub calcular {
my $operacion = $_[0] * $_[1];
return $operacion;
}
return calcular($lado_1, $lado_2);
}
}
print area_cuadrado(5, 5);
La funcion area_cuadrado
tiene como parametro $lado_1
y $lado_2
, dentro de ella tiene un bloque anonimo con la funcion calcular
, la cual tiene la variable $operacion
con el resultado de multiplicar $_[0]
(lado_1) y $_[1]
(lado_2).
Dentro del mismo bloque anonimo se llama a la funcion calcular
con los parametros de area_cuadrado
.
- El valor de retorno de
area_cuadrado
es el ultimo return - La funcion
calcular
se debe de llamar dentro del mismo bloque anonimo por temas de alcance de las variables