【发布时间】:2018-07-13 17:04:33
【问题描述】:
我熟悉caller 函数,程序可以使用它来了解调用它的位置、从哪个文件、包等。有没有简单的方法让程序知道调用者嵌套的深度?用例是添加一些调试行,而不必显式计算嵌套级别。
我不是在寻找堆栈跟踪。我试图找出调用函数在另一个函数范围内的嵌套程度。
例如:
sub my_debug {
my ($txt) = @_;
my ($package, $filename, $line) = caller;
# Is there a way to know how deeply nested the caller is?
my $level = ... # How to get this?
print "DEBUG: You are calling from package $package in $filename "
. "line $line nesting level $level: MSG: $txt\n";
}
sub badly_nested {
for my $i ( 1..10 ) {
# 1-level deep
for my $j ( 1 .. 10 ) {
# 2-levels deep
my_debug( "j is $j" );
for my $k ( 1 .. 10 ) {
# 3-levels deep
}
}
}
}
【问题讨论】:
-
谢谢@AbhiNickz,但我想知道的不是我有多少堆栈帧(堆栈跟踪会告诉你什么),而是嵌套的级别(
if ... { if ... { if ... { for ... { } } } }。在 python 中,你可以计算前导空格并除以缩进量来解决这个问题。 -
想象一下设置一个具有更高值的调试标志以获取有关内部循环的更多详细信息
-
正确缩进你的代码,就像在 python 中一样
-
@Flying_whale 这可能适用于某些代码,但它很容易被带有
{或}字符的引用字符串破坏,所以这将进入我需要一个完整的解析器路线...这是我试图避免的。使用Scope::Upper的解决方案效果很好,不需要重新解析任何东西。