Las subrutinas que han sido definidas en una parte anterior del programa pueden ser llamadas sin usar paréntesis alrededor de la lista de argumentos:
sub fun1 {
my $a = shift; # shift asume el arreglo @_
my $y = 2 * $a;
return ( $y );
}
# mas tarde ...
$x = fun1 4;
Otra forma de llamar una subrutina es usar & pero sin lista de argumentos.
En tal caso, los contenidos actuales del array especial @_ se pasan
como argumentos a la subrutina.
Ejemplo:
sub checked_inverse {
die "can't invert 0" if $_[0] == 0;
my $inv = &inverse; # llama a &inverse con los argumentos actuales
die "inversion failed" unless $inv*$_[0] == 1;
return $inv;
}
Observe que esto significa que hay una importante diferencia entre:
&checked_inverse # significa checked_inverse(@_);y
checked_inverse; # significa checked_inverse();
Una última variación utiliza el prefijo & pero invoca
a la subrutina a través de un goto:
goto &inverse;
Que llama a la función y le pasa los argumentos en @_. Pero no se vuelve
a la siguiente sentencia después de la llamada. En vez de eso, goto &inverse
reemplaza la llamada a la subrutina actual por una llamada a inverse.
Esta forma especial de llamada se usa principalmente
en las subrutinas de carga automática.