Pregunta

Sé que fácilmente podría hacer algo así

sub sin {
    sin($_[0]);
}

y simbólicamente referencia que para cada función que necesitan ref symb, pero sólo me gustaría saber si hay una manera de hacer algo como

{$foo}(123);

vs.

&{$foo}(123);

que funciona, pero no para las funciones básicas.

Gracias.

¿Fue útil?

Solución

Que yo sepa no, usted no puede hacerlo. Por motivos de rendimiento, funciones CORE nunca se ven en la tabla de símbolos MENOS una función equivalente CORE::GLOBAL ha sido declarada en tiempo de compilación. Desafortunadamente, usted tiene que escribir esa función CORE::GLOBAL y hacerlo bien para simular las convenciones de llamada de la función real. Algunas funciones CORE no puede ser reproducido en su totalidad y sin cortes masiva, print y open por ejemplo. Desde CORE::GLOBAL es global un todo su código y todo el código de biblioteca de efectos que tiene que estar seguro de conseguirlo exactamente derecha o causa muy difícil de depurar errores. Algunos módulos, como autodie , tiene que ir a grandes longitudes para envolver alrededor de funciones básicas.

Pero aquí, déjame mostrarte donde el armario de armas de fuego y munición son ...

my @return = eval "$function(\@args)";

... por supuesto, esto es un problema de seguridad y facilidad de mantenimiento masiva. No lo haga.

Otros consejos

Si leo esta pregunta SO correctamente, no se puede tomar una referencia a una función incorporada. Sospecho que las dificultades análogas le impide invocar muebles empotrados usando referencias simbólicas.

En cuanto al uso de referencias simbólicas al código de invocación, sugeriría que utilice una mesa de despacho en su lugar. Por ejemplo:

use strict;
use warnings;

sub sin_deg { sin $_[0] * atan2(1, 1) / 45 }

my %dt = (
    sin_deg => \&sin_deg,
    attack  => sub { print "Attacking: @_\n" },
);

print $dt{sin_deg}->(60), "\n";

$dt{attack}->(1, 2, 3);

Parece que se debe redefinir las funciones básicas en tiempo de compilación, y luego se puede jugar con ellos. Me gusta el hash de despacho (o escalar) mejor enfoque, sin embargo.

use strict;
use warnings;

our $s;
BEGIN {
  *CORE::GLOBAL::sin= sub { sin($_[0])*2 };
  *CORE::GLOBAL::cos= sub { cos($_[0])*2 };
  our $s= *CORE::GLOBAL::sin;
}

*CORE::GLOBAL::sin= *CORE::GLOBAL::cos;
print sin(0.01)."\n";
print $s->(0.01)."\n";
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top