如何在perl中访问更高堆栈帧中的变量?

时间:2015-03-05 02:33:16

标签: perl stack-trace

我怎样才能在Perl中做这样的事情?例如。在未定义的函数中访问$ a?我不想使用全局变量,也不想使用CPAN模块或将$ a作为参数传递给bar。

sub foo {
  my $a;
  bar();
}

sub bar {
  print STDOUT "a is " .  magic_function_that_looks_into_callers_frame('a');
}

2 个答案:

答案 0 :(得分:1)

这听起来像你正在寻找的是动态范围(即,值直到Perl执行完成它启动它的子程序)。 Perl使用local(而非my)实现此功能。请查看答案:https://stackoverflow.com/a/8473837/2140998,但这是一个小例子:

our $foo;

sub top {
    local $foo = "top";
    bar();
}

sub bar {
    say "Called from $foo";
}

top();

因此,可以从调用堆栈帧访问(变量的值)变量,尽管变量需要实际存在于全局中,否则代码将无法正确编译(Perl确实喜欢它的词法作用域)。

对于更高级的工作,还有:https://metacpan.org/pod/PadWalker,但这真的与Perl的内部结构一起使用,所以不能正常使用。

答案 1 :(得分:0)

因为$ a在bar()的环境中被调用,所以出路是用$ a作为参数调用bar()。例如:

sub bar {
  print @_;
}

sub foo {
  my $a = "what";
  bar($a);
}

foo;