В perl, в чем разница между $DB:: single = 1 и 2?

В чем разница между помещением $DB::single=1 и $DB::single=2 в ваш код? Оба, похоже, имеют одинаковый эффект остановки выполнения в заявлении, следующем за назначением, когда я делаю "c" в командной строке отладчика perl.

perldebug говорит, что значение 1 равносильно просто нажатию 's', чтобы перейти к следующему утверждению, а 2 - то же самое, что и "n", но какая разница, как вы это делаете?

Ответ 1

От perldebug:

Если вы установите $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 был установлен (он всегда выполняет текущую строку независимо):

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

Вот почему, если вы установите переменную в свой код 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 (см. предыдущую таблицу, чтобы увидеть, что означают эти комбинации).

Возможность использовать либо 1, либо 2 в вашем коде Perl является прямым результатом того, что вы используете хитрый, но умный трюк, чтобы прервать выполнение из вашего самого кода Perl, установив переменную, которая обычно устанавливается командой отладчика.

Вот почему это не значение, которое имеет значение так же, как факт, что вы вынуждаете отладчик в конкретное состояние.