Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在perl中,$DB::single=1和2之间有什么区别?_Perl - Fatal编程技术网

在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;
}