me he encontrado con el siguiente patrón de un par de veces, mientras que el desarrollo de módulos de Perl que utilizan AUTOLOAD
u otras técnicas subrutina de despacho:¿Cómo localizar una variable en un ámbito superior en Perl?
sub AUTOLOAD {
my $self = $_[0];
my $code = $self->figure_out_code_ref($AUTOLOAD);
goto &$code;
}
Esto funciona bien, y caller
ve el alcance correcto.
Ahora lo que me gustaría hacer es establecer $_
localmente igual a $self
durante la ejecución de &$code
. ¿Cuál sería algo como esto:
sub AUTOLOAD {
my $self = $_[0];
my $code = $self->figure_out_code_ref($AUTOLOAD);
local *_ = \$self;
# and now the question is how to call &$code
# goto &$code; # wont work since local scope changes will
# be unrolled before the goto
# &$code; # will preserve the local, but caller will report an
# additional stack frame
}
Soluciones que conlleva incluir caller
no son aceptables debido a problemas de rendimiento y de dependencia. Entonces eso parece descartar la segunda opción.
Volviendo a la primera, la única manera de evitar que el nuevo valor de $_
de ir fuera de alcance durante el goto
sería o bien no localizar el cambio (no es una opción viable) o para implementar algún tipo de uplevel_local
o goto_with_local
.
He jugado un poco con todo tipo de permutaciones que implican PadWalker
, Sub::Uplevel
, Scope::Upper
, B::Hooks::EndOfScope
y otros, pero no han sido capaces de llegar a una solución robusta que limpia $_
en el momento adecuado, y no se ajusta caller
.
¿Alguien ha encontrado un patrón que funcione en este caso?
(la pregunta SO: How can I localize Perl variables in a different stack frame? está relacionado, pero conservando caller
no era un requisito, y en última instancia la respuesta que había que usar un enfoque diferente, por lo que la solución no es útil en este caso)
Seré honesto que estoy un poco perdido aquí. pero podrías hacer nuestro $ _; ? así que tienes acceso a $ _ localmente pero también acceso a ...$ Package :: $ _ en serio aunque esto está por encima de mi alcance del cerebro – xenoterracide
@xenoterracide => No estoy seguro de a dónde va con la idea del alcance del paquete, pero '$ _' (y la mayoría de las otras variables de puntuación) son comunes en todos los paquetes y no pueden ser del mismo tamaño con 'our'. el léxico '$ _' (' my $ _; ') es una bestia completamente diferente, pero eso está más allá del alcance de esta pregunta, perdón por el juego de palabras –
, no estoy seguro de ir a ninguna parte con él. pero Perl no grita acerca de "nuestro $ _;' así que estoy asumiendo que $ _ puede verse afectado con eso también; tal vez asumiendo mal sin embargo. Si tuviera una respuesta real, habría respondido de esa manera. – xenoterracide