El formulario de subrutina &() deshabilita la comprobación del prototipo. Esto puede o no ser lo que quieres.
http://www.perl.com/doc/manual/html/pod/perlsub.html#Prototypes
Prototipos le permiten especificar el número y tipo de sus argumentos a subrutinas, y que se verifiquen en tiempo de compilación. Esto puede proporcionar asistencia de diagnóstico útil.
Los prototipos no se aplican a las llamadas a métodos, o llamadas hechas en el estilo pasado de moda usando el prefijo &.
El & es necesario hacer referencia o eliminar la referencia de una subrutina o código de referencia
por ejemplo
sub foo {
# a subroutine
}
my $subref = \&foo; # take a reference to the subroutine
&$subref(@args); # make a subroutine call using the reference.
my $anon_func = sub { ... }; # anonymous code reference
&$anon_func(); # called like this
Los prototipos tampoco son aplicables a las referencias de subrutinas.
La forma de subrutina & también se utiliza en la llamada forma magic goto.
La expresión goto &subroutine
reemplaza el contexto de la llamada actual con una llamada a la subrutina con nombre, utilizando el valor actual de @_.
Básicamente, puede cambiar por completo una llamada a una subrutina con una llamada al nombre. Esto se ve comúnmente en los bloques de AUTOLOAD, donde se puede realizar una llamada de subrutina diferida, quizás con alguna modificación a @_, pero se ve al programa por completo como si fuera una llamada al sub nombrado.
p. Ej.
sub AUTOLOAD {
...
push @_, @extra_args; # add more arguments onto the parameter list
goto &subroutine ; # change call another subroutine, as if we were never here
}
}
Potencialmente esto podría ser útil para tail call elimination, supongo.
ver detailed explanation of this technique here
¿Podría ampliar la parte sobre "comportamiento de llamada no predeterminado"? –
Excepto que '& $ x()' no es realmente la mejor manera de llamar a un código ref; probablemente debería desreferenciarlo, como cualquier otra ref: $ x ->(). –
La única vez que uso '&' en una llamada es para 'AUTOLOAD '. El objetivo no es la optimización, sin embargo, es limpiar la pila de llamadas si alguien quiere hacer un seguimiento. –