我怎样才能在Perl中做这样的事情?例如。在未定义的函数中访问$ a?我不想使用全局变量,也不想使用CPAN模块或将$ a作为参数传递给bar。
sub foo {
my $a;
bar();
}
sub bar {
print STDOUT "a is " . magic_function_that_looks_into_callers_frame('a');
}
答案 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;