В Perl, в чем разница между $ DB :: single = 1 и 2? - PullRequest
11 голосов
/ 20 декабря 2010

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

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

1 Ответ

17 голосов
/ 20 декабря 2010

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

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, установив переменную, которая обычно устанавливается командой отладчика.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...