如何在 perl 中访问更高堆栈帧中的变量?
How do I access variables in a higher stack frame in perl?
我怎样才能在 Perl 中做这样的事情?例如。在未定义的函数中访问 $a?我不想使用全局变量,也不想使用 CPAN 模块或将 $a 作为参数传递给 bar。
sub foo {
my $a;
bar();
}
sub bar {
print STDOUT "a is " . magic_function_that_looks_into_callers_frame('a');
}
由于调用 bar() 时 $a 处于 bar() 的环境中,一个解决方法是调用 bar() 并以 $a 作为参数。例如:
sub bar {
print @_;
}
sub foo {
my $a = "what";
bar($a);
}
foo;
听起来您正在寻找的是动态范围(即,该值一直存在,直到 Perl 执行完启动它的子例程)。 Perl 使用 local
(而不是 my
)来实现这一点。查看答案:,但这里有一个小例子:
our $foo;
sub top {
local $foo = "top";
bar();
}
sub bar {
say "Called from $foo";
}
top();
因此可以从调用堆栈帧访问变量(的值),尽管变量需要实际存在于全局,否则代码将无法正确编译(Perl 确实喜欢它的词法范围)。
对于更高级的工作,还有:https://metacpan.org/pod/PadWalker,但这实际上是在玩弄 Perl 的内部结构,因此不适合正常使用。
我怎样才能在 Perl 中做这样的事情?例如。在未定义的函数中访问 $a?我不想使用全局变量,也不想使用 CPAN 模块或将 $a 作为参数传递给 bar。
sub foo {
my $a;
bar();
}
sub bar {
print STDOUT "a is " . magic_function_that_looks_into_callers_frame('a');
}
由于调用 bar() 时 $a 处于 bar() 的环境中,一个解决方法是调用 bar() 并以 $a 作为参数。例如:
sub bar {
print @_;
}
sub foo {
my $a = "what";
bar($a);
}
foo;
听起来您正在寻找的是动态范围(即,该值一直存在,直到 Perl 执行完启动它的子例程)。 Perl 使用 local
(而不是 my
)来实现这一点。查看答案:,但这里有一个小例子:
our $foo;
sub top {
local $foo = "top";
bar();
}
sub bar {
say "Called from $foo";
}
top();
因此可以从调用堆栈帧访问变量(的值),尽管变量需要实际存在于全局,否则代码将无法正确编译(Perl 确实喜欢它的词法范围)。
对于更高级的工作,还有:https://metacpan.org/pod/PadWalker,但这实际上是在玩弄 Perl 的内部结构,因此不适合正常使用。