Od perldebug
:
Jeśli ustawisz $DB::single
do 2
, jest to równoznaczne z konieczności tylko wpisane polecenie n
(który wykonuje ponad wywołań podprogramów), natomiast wartość 1
oznacza komendę s
(który wchodzi wywołań podprogramów) .
Tyle już wiesz.
Z punktu widzenia użytkownika jestem prawie pewien, że nie ma różnicy. Opieram to na badaniu rzeczywistego DB.pm
source code.
Przejdźmy do tego logicznie. Możesz odwołać się do kodu źródłowego. Uprośniłem trochę kodu, aby usunąć niepotrzebne szczegóły, ale powinieneś być w stanie uzyskać pomysł z moich opisów.
Podczas wykonywania kodu w debugerze są (przynajmniej) dwie ważne zmienne, running
i single
. Połączenie z nich to, co decyduje, czy kod jest uruchamiany:
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
Funkcja DB()
wykonywana jest dla każdej pojedynczej linii i zawiera następujący fragment kodu, który będzie zatrzymać uruchomiony jeśli single
został ustawiony (to zawsze wykonuje obecny skład niezależnie):
if ($DB::single) {
$DB::single = 0;
$running = 0;
}
Dlatego, jeśli ustawić zmienną w kodzie Perl, będzie przerwa (o zerwaniu, to znaczy „stop działa kod”, a nie „uszkodzenie jakoś”) debugger w następna linia.
Kiedy running
jest 0
funkcja DB()
wchodzi tę małą pętlę:
# Now sit in an event loop until something sets $running
do {
$c->idle; # call client event loop; must not block
} until $running;
Innymi słowy, to czeka na polecenia użytkownika, który ustawia running
z powrotem do 1
. Można to zrobić za pomocą jednej z trzech następujących funkcji:
sub next {
$DB::single = 2;
$running = 1;
}
sub step {
$DB::single = 1;
$running = 1;
}
sub cont {
$DB::single = 0;
$running = 1;
}
Widać, że te trzy polecenia skonfigurować inną kombinację single
i running
, która będzie używana podczas wykonywania następnego wiersza Perl (patrz wcześniejszy stół aby zobaczyć, co oznaczają te kombinacje).
Możliwość użyć 1
lub 2
w kodzie Perl jest bezpośrednim wynikiem tego, że używasz podstępne ale sprytny trik przerwać wykonywanie kodu Perl od siebie, ustawiając zmienną, która zwykle ustawia się za pomocą polecenia debuggera.
To dlatego wartość nie ma tak dużego znaczenia, jak wymuszenie debuggera w określonym stanie.
nie podstępne, dobrze udokumentowane. – ysth
Może to być dobrze udokumentowane, ale jestem zdania, że był to prosty efekt uboczny sposobu pracy DB.pm, który odkrył ktoś był przydatny (nawet jeśli był to oryginalny autor). Nikt przy zdrowych zmysłach nie zaprojektowałby takiego interfejsu API :-) Zapewniliby funkcję, która by to zrobiła, aby nie eksponować wewnętrznych działań, a nie tylko pozwolić na ustawienie zmiennej na dwie różne wartości, różnica między tymi wartości są absolutnie niczym pod względem użytkowania. – paxdiablo