在perl中,$ DB :: single = 1和2之间有什么区别?

ces*_*oza 12 perl

推送$DB::single=1$DB::single=2代码之间有什么区别?当我在perl调试器命令行上执行'c'时,两者似乎都具有在赋值后停止执行的相同效果.

perldebug 说值为1相当于只按下's'进入下一个语句,2和'n'相同,但是它与你如何得到这个陈述有什么区别?

pax*_*blo 18

来自perldebug:

如果设置$DB::single2,则相当于只输入n命令(通过子程序调用执行),而值则1表示s命令(进入子程序调用).

你已经知道了很多.


从用户的角度来看,我很确定没有区别.我的基础是对实际DB.pm 源代码的检查.

让我们逻辑地遵循这一点.您可能想参考源代码.我已经简化了一些代码来删除不必要的细节,但你应该能够从我的描述中得到这个想法.

当您在调试器中执行代码时,(至少)有两个重要变量,runningsingle.这些的组合决定了代码是否运行:

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
Run Code Online (Sandbox Code Playgroud)

DB()函数是针对每一行执行的,它包含以下片段,如果single已设置,它将停止运行(无论如何总是执行当前行):

if ($DB::single) {
    $DB::single = 0;
    $running = 0;
}
Run Code Online (Sandbox Code Playgroud)

这就是为什么,如果你在你的Perl代码中设置变量,它将在下一行中断(通过中断,我的意思是"停止运行代码",而不是"以某种方式损坏")调试器.

如果running0,该DB()功能进入这个小环:

# Now sit in an event loop until something sets $running
do {
    $c->idle;          # call client event loop; must not block
} until $running;
Run Code Online (Sandbox Code Playgroud)

换句话说,它等待running返回的用户命令1.这可以通过以下三个功能之一来完成:

sub next {
    $DB::single = 2;
    $running = 1;
}

sub step {
    $DB::single = 1;
    $running = 1;
}

sub cont {
    $DB::single = 0;
    $running = 1;
}
Run Code Online (Sandbox Code Playgroud)

您可以看到这三个命令设置了不同的组合,single并且running在执行下一个Perl行时将使用这些组合(请参阅前面的表以了解这些组合的含义).

使用Perl代码中的任何一个12在你的Perl代码中的能力直接导致你通过设置一个通常由调试器命令设置的变量,使用一个偷偷摸摸但聪明的技巧来破坏Perl代码本身的执行.

这就是为什么重要的不是因为你迫使调试器进入特定状态的事实.

  • 它可能有很好的文档记录_但是我认为这是DB.pm工作方式的简单副作用,有人发现它很有用(即使有人是原作者).在他们正确的思想中没有人会_design_这样的API :-)他们会提供一个函数来做到这一点,以便不暴露内部工作,而不仅仅是让变量设置为两个不同的值,这些之间的差异价值在使用方面绝对没有. (4认同)