测试文件:
#!/usr/bin/perl
use utf8;
use strict;
use warnings;
my $var = 'Здравствуйте';
print $var;
我们在调试器中运行它:
$ perl -d ./test.pl
Loading DB routines from perl5db.pl version 1.55
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
main::(./test.pl:7): my $var = 'Здравствуйте';
DB<1> p $var
Wide character in print at (eval 8)[/usr/share/perl/5.30/perl5db.pl:738] line 2.
at (eval 8)[/usr/share/perl/5.30/perl5db.pl:738] line 2.
eval 'no strict; ($@, $!, $^E, $,, $/, $\\, $^W) = @DB::saved;package main; $^D = $^D | $DB::db_stop;
print {$DB::OUT} $var;
' called at /usr/share/perl/5.30/perl5db.pl line 738
DB::eval called at /usr/share/perl/5.30/perl5db.pl line 3138
DB::DB called at ./test.pl line 9
Здравствуйте
DB<2> x $var
0 '\x{0417}\x{0434}\x{0440}\x{0430}\x{0432}\x{0441}\x{0442}\x{0432}\x{0443}\x{0439}\x{0442}\x{0435}'
p
命令后的“打印中的宽字符”警告?x
转储变量时打印文本而不是符号代码?请参阅此 answer,将调试器输出句柄设置为 utf-8,它修复了 p 命令。 (简而言之:从调试器内部调用
binmode($DB::OUT,':utf8')
)
对于 x 的输出,调试器需要文件 dumpvar.pl 并使用其 dumpValue 子文件。
不幸的是,该代码替换了 255 以上的代码点:
sub uniescape {
join("",
map { $_ > 255 ? sprintf("\\x{%04X}", $_) : chr($_) }
unpack("W*", $_[0]));
}
要解决此问题,您可以注释掉对 uniescape 的调用(dumpvar.pl 中的第 102 行)。由于该文件是必需的,如果您不想更改原始版本,您也可以在 @INC 中拥有修改版本。