Чтобы повторить вывод вопроса, выполните
#! /usr/bin/env perl
use Data::Dumper;
print Dumper \%main::;
Записи, которые вы видите, вставлены в 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
}
Это называетсямного раз посредством newXS
как части процесса загрузки в S_parse_body
.
boot_core_PerlIO();
boot_core_UNIVERSAL();
boot_core_mro();
Обратите внимание, что вы также видите записи для perlio.c
, universal.c
и mro.c
в выводе.
Раздел Внутренние компоненты отладчика документации perldebguts объясняет их использование:
Например, всякий раз, когда вы вызываете встроенную функцию вызова Perl из пакета DB
, аргументы, с которыми был вызван соответствующий кадр стека, копируются в массив @DB::args
.Эти механизмы активируются путем вызова Perl с переключателем -d
.В частности, включены следующие дополнительные функции (см. $^P
в perlvar ):
- …
- Каждый массив
@{"_<$filename"}
содержит строки $filename
для файла, скомпилированного Perl.То же самое относится и к исключенным строкам, которые содержат подпрограммы или которые в настоящее время выполняются.$filename
для извлеченных струн выглядит как (eval 34)
.Утверждения кода в регулярных выражениях выглядят так: (re_eval 19)
. - Каждый хеш
%{"_<$filename"}
содержит точки останова и действия, обозначенные номером строки.Отдельные записи (в отличие от всего хэша) могут быть установлены.Здесь Perl заботится только о логическом значении true, хотя значения, используемые perl5db.pl
, имеют вид "$break_condition\0$action"
.
То же самое верно для оцененных строк, которые содержат подпрограммы или которые в настоящее время выполняются.$ Filename для исключенных строк выглядит как (eval 34) или (re_eval 19). - Каждый скаляр
${"_<$filename"}
содержит "_<$filename"
.Это также относится к вычисляемым строкам, которые содержат подпрограммы или которые в настоящее время выполняются.$filename
для исключенных строк выглядит как (eval 34)
или (re_eval 19)
. - После компиляции каждого необходимого файла, но перед его выполнением, вызывается
DB::postponed(*{"_<$filename"})
, если подпрограмма DB::postponed
существует.Здесь $filename
- это расширенное имя требуемого файла, которое можно найти в значениях %INC
. - …