Я не могу оценить 'современный 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 '"]
Я что-то упускаю?
Это интересный вопрос, о котором я никогда не думал, так что спасибо за это.
Я нашел ссылку на проблему здесь, но ей около года. Однако соответствующая часть исходного кода 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'; (или просто 'state', или просто 'say').
- Установите переменную окружения PERL5DB на "BEGIN { require 'myperl5db.pl' }"
Которую я нашел на PerlMonks.