在perl中,$DB::single=1和2之间有什么区别?
将在perl中,$DB::single=1和2之间有什么区别?,perl,Perl,将$DB::single=1和$DB::single=2放在代码中有什么区别?当我在perl调试器命令行上执行“c”时,这两种方法似乎具有相同的效果,即在赋值后的语句处停止执行 表示值1相当于刚刚按下“s”键进入下一条语句,2与“n”相同,但它与进入语句的方式有什么区别?来源: 如果将$DB::single设置为2,则相当于刚刚键入了n命令(通过子例程调用执行),而1值表示s命令(进入子例程调用) 你已经知道很多了 从用户的角度来看,我很确定两者没有区别。我基于对实际DB.pm的检查 让我们逻
$DB::single=1
和$DB::single=2
放在代码中有什么区别?当我在perl调试器命令行上执行“c”时,这两种方法似乎具有相同的效果,即在赋值后的语句处停止执行
表示值1相当于刚刚按下“s”键进入下一条语句,2与“n”相同,但它与进入语句的方式有什么区别?来源:
如果将$DB::single
设置为2
,则相当于刚刚键入了n
命令(通过子例程调用执行),而1
值表示s
命令(进入子例程调用)
你已经知道很多了
从用户的角度来看,我很确定两者没有区别。我基于对实际
DB.pm
的检查
让我们逻辑地遵循这一点。您可能需要参考源代码。我已经简化了一些代码以删除不必要的细节,但是您应该能够从我的描述中得到想法
在调试器中执行代码时,(至少)有两个重要变量,running
和single
。这些因素的组合决定了代码是否运行:
running single description
------- ------ -----------
0 ? not running
1 0 running flat-out
1 1 single stepping, execute into function
1 2 single stepping, execute over function
DB()
函数将对每一行执行,它包含以下代码段,如果设置了single
,则该代码段将停止运行(它始终执行当前行):
这就是为什么,如果在Perl代码中设置变量,它将在下一行中断(中断,我的意思是“停止运行代码”,而不是“以某种方式损坏”)调试器
当running
为0
时,DB()
函数进入这个小循环:
# Now sit in an event loop until something sets $running
do {
$c->idle; # call client event loop; must not block
} until $running;
换句话说,它等待一个用户命令,该命令将running
设置回1
。这可以通过以下三个功能之一完成:
sub next {
$DB::single = 2;
$running = 1;
}
sub step {
$DB::single = 1;
$running = 1;
}
sub cont {
$DB::single = 0;
$running = 1;
}
您可以看到,这三个命令设置了single
和running
的不同组合,这将在执行下一行Perl时使用(请参阅前面的表以了解这些组合的含义)
在Perl代码中使用1
或2
的能力是一个直接的结果,这是因为您使用了一个狡猾但巧妙的技巧,通过设置一个通常由调试器命令设置的变量来中断Perl代码本身的执行
这就是为什么将调试器强制到特定状态这一事实与其说是值更重要。现在可能有很好的文档记录,但我认为这只是DB.pm工作方式的一个简单副作用,有人发现它是有用的(即使某人是原始作者)。没有一个头脑正常的人会设计这样一个API:-)他们会提供一个函数来这样做,这样就不会暴露内部工作,而不仅仅是让一个变量设置为两个不同的值,这些值之间的差异在使用方面是绝对没有的。
sub next {
$DB::single = 2;
$running = 1;
}
sub step {
$DB::single = 1;
$running = 1;
}
sub cont {
$DB::single = 0;
$running = 1;
}