如何在 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 的内部结构,因此不适合正常使用。