加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 22:01:39 所属栏目:大数据 来源:网络整理
导读:在代码中放置$DB :: single = 1和$DB :: single = 2有什么区别?当我在perl调试器命令行上执行’c’时,两者似乎都具有停止执行后的执行相同的效果. perldebug 表示,值1相当于刚刚按下“下一步”,2与“n”相同,但是如何达成声明有什么区别? 解决方法 从 perl
在代码中放置$DB :: single = 1和$DB :: single = 2有什么区别?当我在perl调试器命令行上执行’c’时,两者似乎都具有停止执行后的执行相同的效果.

perldebug表示,值1相当于刚刚按下“下一步”,2与“n”相同,但是如何达成声明有什么区别?

解决方法

perldebug

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

你已经知道了

从用户的角度来看,我确信没有任何区别.我以此为基础来检查实际的DB.pm source code.

我们来逻辑地跟着.您可能需要参考源代码.我已经简化了一些代码,以消除不必要的细节,但是您应该可以从我的描述中获得想法.

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

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()函数是为每一行执行的,它包含以下代码段,如果已经设置了单个行,它将停止运行(它总是执行当前行):

if ($DB::single) {
    $DB::single = 0;
    $running = 0;
}

这就是为什么,如果你在Perl代码中设置变量,它会在下一行断开(通过break,我的意思是“停止运行代码”,而不是“损坏某种程度”)调试器.

当运行为0时,DB()函数进入这个小循环:

# Now sit in an event loop until something sets $running
do {
    $c->idle;          # call client event loop; must not block
} until $running;

换句话说,它等待用户命令设置运行回到1.这可以通过以下三个功能之一完成:

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

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

sub cont {
    $DB::single = 0;
    $running = 1;
}

您可以看到,这三个命令设置了单个和运行的不同组合,这将在执行下一个Perl行时使用(参见前面的表格,以了解这些组合是什么意思).

在Perl代码中使用1或2的能力是直接的结果,因为您使用一个鬼祟而聪明的技巧来从Perl代码本身中断执行,通过设置通常由调试器设置的变量命令.

这就是为什么不重要的价值,因为你强迫调试器处于特定状态.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读