如何在Perl的上部作用域中本地化变量?

如何在Perl的上部作用域中本地化变量?,第1张

概述在开发使用AUTOLOAD或其他子例程调度技术的Perl模块时,我已经多次运行以下模式: sub AUTOLOAD { my $self = $_[0]; my $code = $self->figure_out_code_ref( $AUTOLOAD ); goto &$code;} 这工作正常,调用者看到正确的范围. 现在我想做的是在执行& $代码期间本地设置$_ 在开发使用autoLOAD或其他子例程调度技术的Perl模块时,我已经多次运行以下模式:

sub autoLOAD {    my $self = $_[0];    my $code = $self->figure_out_code_ref( $autoLOAD );    goto &$code;}

这工作正常,调用者看到正确的范围.

现在我想做的是在执行& $代码期间本地设置$_等于$self.这将是这样的:

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  }

由于性能和依赖性问题,涉及包装调用者的解决方案是不可接受的.所以这似乎排除了第二种选择.

回到第一个,防止$_的新值在goto期间超出范围的唯一方法是要么不本地化更改(不是可行的选项),要么实现某种uplevel_local或goto_with_local.

我玩过各种各样的排列,涉及PaDWalker,Sub :: Uplevel,Scope :: Upper,B :: Hooks :: EndOfScope等,但是还没有能够提出一个强大的解决方案来清理$_ at正确的时间,并没有包裹来电者.

有没有人发现在这种情况下有效的模式?

(SO问题:How can I localize Perl variables in a different stack frame?是相关的,但保留调用者不是必需的,最终答案是使用不同的方法,因此在这种情况下解决方案没有帮助)

解决方法 Sub :: Uplevel似乎有效 – 至少对于不涉及autoLOAD的简单情况:

use strict;use warnings;use Sub::Uplevel;$_ = 1;bar();sub foo {    printf  "%s %s %d - %s\n",caller,$_}sub bar {    my $code = \&foo;    my $x    = 2;    local *_ = $x;    uplevel 1,$code;}

输出是:

main c:\temp\foo.pl 6 - 2

当然,这并没有真正本地化父作用域中的变量,但即使你可以,我也不认为你真的想要这样做.您只想在呼叫期间本地化$_.

总结

以上是内存溢出为你收集整理的如何在Perl的上部作用域中本地化变量?全部内容,希望文章能够帮你解决如何在Perl的上部作用域中本地化变量?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1271263.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存