Как использовать функции Perl 5.10 внутри отладчика? - PullRequest
12 голосов
/ 22 августа 2010

Я не могу оценить код 'современного 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";

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

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

1 Ответ

7 голосов
/ 22 августа 2010

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

Я нашел ссылку на вопрос здесь , но ему около года.Однако соответствующая часть источника 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 .

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