Подтвердить что ты не робот

Как использовать функции 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 '([email protected], $!, $^E, $,, $/, $\\, $^W) = @saved;package main; $^D = $^D | $DB::db_stop;say "x";

[примечание: то же самое происходит с "функцией использования": 5.10 '"]

Я что-то пропустил?

4b9b3361

Ответ 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

Ближайшим я видел решение:

  • скопировать perl5db.pl из PERL5LIB в любой из PERL5LIB или в текущий каталог с другим именем, скажем myperl5db.pl
  • Измените myperl5db.pl, чтобы использовать функцию ': 5.10'; (или просто "состояние", или просто "сказать" ) в первой строке.
  • Задайте переменную окружения PERL5DB "BEGIN {require" myperl5db.pl "}"

Что я нашел в PerlMonks.