作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在开发使用 AUTOLOAD
的 Perl 模块时,我曾多次遇到以下模式。或其他子程序调度技术:
sub AUTOLOAD {
my $self = $_[0];
my $code = $self->figure_out_code_ref( $AUTOLOAD );
goto &$code;
}
caller
看到正确的范围。
$_
等于
$self
在
&$code
执行期间.这将是这样的:
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
}
caller
由于性能和依赖性问题,是 Not Acceptable 。所以这似乎排除了第二种选择。
$_
出现新值的唯一方法在
goto
期间超出范围要么不本地化更改(不是一个可行的选项),要么实现某种
uplevel_local
或
goto_with_local
.
PadWalker
的排列。 ,
Sub::Uplevel
,
Scope::Upper
,
B::Hooks::EndOfScope
和其他人,但未能提出一个强大的解决方案来清理
$_
在正确的时间,并且不换行
caller
.
caller
不是必需的,最终答案是使用不同的方法,因此该解决方案在这种情况下没有帮助)
最佳答案
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 的上层范围内本地化变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3357548/
我是一名优秀的程序员,十分优秀!