Para repetir la salida de la cuestión, ejecute
#! /usr/bin/env perl
use Data::Dumper;
print Dumper \%main::;
Las entradas que se ve se inserta en gv_fetchfile_flags
:
/* This is where the debuggers %{"::_<$filename"} hash is created */
tmpbuf[0] = '_';
tmpbuf[1] = '<';
memcpy(tmpbuf + 2, name, namelen);
gv = *(GV**)hv_fetch(PL_defstash, tmpbuf, tmplen, TRUE);
if (!isGV(gv)) {
gv_init(gv, PL_defstash, tmpbuf, tmplen, FALSE);
#ifdef PERL_DONT_CREATE_GVSV
GvSV(gv) = newSVpvn(name, namelen);
#else
sv_setpvn(GvSV(gv), name, namelen);
#endif
}
esto se le llama muchas veces por camino de newXS
como parte del boot process in S_parse_body
.
boot_core_PerlIO();
boot_core_UNIVERSAL();
boot_core_mro();
Tenga en cuenta que también se puede ver entradas para perlio.c
, universal.c
y mro.c
en la salida.
La sección Debugger Internals del perldebguts documentation explica su uso:
Por ejemplo, cada vez que se llama a Perl incorporado en función de la persona que llama desde el paquete DB
, los argumentos de que el marco de pila correspondiente fue llamado con se copian la matriz @DB::args
. Estos mecanismos se habilitan llamando a Perl con el interruptor -d
. Específicamente, las siguientes características adicionales están habilitadas (cf. $^P
en perlvar):
- ...
- Cada matriz
@{"_<$filename"}
mantiene las líneas de $filename
para un archivo compilado por Perl. Lo mismo también es cierto para las cadenas evaladas que contienen subrutinas, o que se están ejecutando actualmente. El $filename
para cuerdas evaladas se ve como (eval 34)
. Las aserciones de código en expresiones regulares se parecen al (re_eval 19)
.
- Cada hash
%{"_<$filename"}
contiene puntos de corte y acciones marcadas por número de línea. Las entradas individuales (a diferencia del hash completo) son configurables. A Perl solo le importa el booleano verdadero aquí, aunque los valores utilizados por perl5db.pl
tienen el formato "$break_condition\0$action"
.
Lo mismo se aplica a las cadenas evaluadas que contienen subrutinas o que se están ejecutando actualmente. El $ nombre de archivo para cuerdas evaladas se parece a (eval 34) o (re_eval 19).
- Cada escalar
${"_<$filename"}
contiene "_<$filename"
. Este es también el caso de las cadenas evaluadas que contienen subrutinas, o que se están ejecutando actualmente. El $filename
para cuerdas evaladas se ve como (eval 34)
o (re_eval 19)
.
- Después de compilar cada archivo requerido, pero antes de que se ejecute, se llama a
DB::postponed(*{"_<$filename"})
si existe la subrutina DB::postponed
. Aquí, el $filename
es el nombre expandido del archivo requerido, como se encuentra en los valores de %INC
.
- ...
Aquellos parecen ser archivos que definen símbolos de Perl. (por ejemplo, 'universal.c' crea' & utf8 :: upgrade'). – ikegami