Почему в таблице символов% main ::? Есть несколько файлов c - PullRequest
8 голосов
/ 25 июня 2011
'_<perlmain.c' => *{'::_<perlmain.c'},
'_</usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/auto/Data/Dumper/Dumper.so' => *{'::_</usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/auto/Data/Dumper/Dumper.so'},
'_<universal.c' => *{'::_<universal.c'},
'_<xsutils.c' => *{'::_<xsutils.c'},
...

Почему они в таблице символов %main::, когда они полезны?

Ответы [ 2 ]

2 голосов
/ 28 июня 2011

Чтобы повторить вывод вопроса, выполните

#! /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.
1 голос
/ 28 июня 2011

Поскольку perl является языком, основанным на интерпретаторе, ему нужен его интерпретатор , двоичный файл perl. Этот двоичный файл просто читает сценарий Perl и выполняет код, переводя его в машинный код.

Ваш интерпретатор perl скомпилирован с символами отладки, поэтому он содержит информацию об исходных файлах, из которых он построен. Также вы видите объекты загруженных модулей Data::Dumper в вашем примере.

Надеюсь, что поможет

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