Как использовать функции Perl 5.10 внутри отладчика?

Я не могу оценить 'современный Perl' код внутри отладчика perl. Он работает нормально при отладке кода в файле, но не из подсказка.

минимальный пример:

# activating 5-10 features with -E (it works)
$  perl -E 'say "x"'
x
# calling the debugger with -E
# it works for infile code but for prompt line code...
$  perl -dEbug    Loading DB routines from perl5db.pl version 1.33
    DB say "x"
    String found where operator expected at (eval 16)[/local-perl/lib/5.12.1/perl5db.pl:638] line 2, near "say "x""
    at (eval 16)[/local-perl/lib/5.12.1/perl5db.pl:638] line 2
        eval '($@, $!, $^E, $,, $/, $\\, $^W) = @saved;package main; $^D = $^D | $DB::db_stop;say "x";

[примечание: то же самое происходит с "use feature": 5.10 '"]

Я что-то упускаю?

12
задан Pablo Marin-Garcia 22 August 2010 в 01:24
поделиться

1 ответ

Это интересный вопрос, о котором я никогда не думал, так что спасибо за это.

Я нашел ссылку на проблему здесь, но ей около года. Однако соответствующая часть исходного кода perl с тех пор не изменилась, и ее можно увидеть здесь. По сути, если вы посмотрите на toke.c в исходнике perl, то увидите следующее:

if (PL_perldb) {
    /* Generate a string of Perl code to load the debugger.
     * If PERL5DB is set, it will return the contents of that,
     * otherwise a compile-time require of perl5db.pl.  */

    const char * const pdb = PerlEnv_getenv("PERL5DB");
            ...
}
...
if (PL_minus_E)
    sv_catpvs(PL_linestr,
          "use feature ':5." STRINGIFY(PERL_VERSION) "';");

В основном, отладчик загружается до обработки флага -E, поэтому функции еще не включены, когда отладчик загружается. Суть в том, что в настоящее время вы не можете использовать -E с командой -d. Если вы хотите использовать say, switch или любую другую функцию из отладочной подсказки, вы должны сделать это следующим образом:

  DB<1> use feature 'say'; say "x"
  x

Самое близкое решение, которое я видел:

  1. скопируйте perl5db. pl из вашего PERL5LIB либо куда-нибудь в PERL5LIB, либо в текущий каталог, с другим именем, скажем, myperl5db.pl
  2. Отредактируйте myperl5db.pl так, чтобы в первой строке использовалась функция ':5.10'; (или просто 'state', или просто 'say').
  3. Установите переменную окружения PERL5DB на "BEGIN { require 'myperl5db.pl' }"

Которую я нашел на PerlMonks.

7
ответ дан 2 December 2019 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: