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