De perldebug
:
Si establece $DB::single
-2
, es equivalente a tener acaba de escribir el comando n
(que se ejecuta a través de llamadas a subrutinas), mientras que un valor de 1
significa el comando s
(que entra llamadas a subrutinas) .
Eso ya lo sabes.
Desde el punto de vista de un usuario, estoy bastante seguro de que no hay diferencia. Baso esto en un examen de la actual DB.pm
source code.
Sigamos esto lógicamente. Es posible que desee consultar el código fuente. He simplificado parte del código para eliminar detalles innecesarios, pero debería poder obtener la idea de mis descripciones.
Cuando está ejecutando código en el depurador, hay (al menos) dos variables importantes, running
y single
. La combinación de estos es lo que decide si el código es ejecutado:
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
La función DB()
se ejecuta para cada línea, y contiene el siguiente fragmento que detendrá el funcionamiento si single
se ha establecido (siempre ejecuta la línea actual sin tener en cuenta):
if ($DB::single) {
$DB::single = 0;
$running = 0;
}
por eso, si se establece la variable en el código Perl, se romperá (por rotura, me refiero a "detener la ejecución del código", no un "daño de alguna manera") el depurador en la siguiente línea.
Cuando running
es 0
, la función DB()
entra en este pequeño bucle:
# Now sit in an event loop until something sets $running
do {
$c->idle; # call client event loop; must not block
} until $running;
En otras palabras, se espera en un comando de usuario que establece running
de nuevo a 1
. Esto se puede hacer por uno de los siguientes tres funciones:
sub next {
$DB::single = 2;
$running = 1;
}
sub step {
$DB::single = 1;
$running = 1;
}
sub cont {
$DB::single = 0;
$running = 1;
}
Se puede ver que estos tres comandos establecieron una combinación diferente de single
y running
que se utilizará durante la ejecución de la siguiente línea de Perl (véase la tabla anterior para ver lo que significan estas combinaciones).
La capacidad de utilizar ya sea 1
o 2
en el código Perl es un resultado directo del hecho de que está utilizando un astuto, pero inteligente truco a interrumpir la ejecución de su propio código de Perl, mediante el establecimiento de una variable que haría normalmente se establece mediante un comando de depuración.
Es por eso que no es tan importante el valor como el hecho de que está forzando al depurador a un estado en particular.
no furtivo, bien documentado. – ysth
Puede estar bien documentado _now_ pero soy de la opinión de que fue un efecto secundario simple de la forma en que funcionaba DB.pm, que alguien descubrió que era útil (incluso si ese alguien era el autor original). Nadie en su sano juicio diseñará_ una API como esta :-) Habrían proporcionado una función para hacerlo, a fin de no exponer el funcionamiento interno, no dejar que una variable se establezca en dos valores diferentes, la diferencia entre esos valores que no son absolutamente nada en términos de uso. – paxdiablo