Perl调试器中UTF-8文本输出问题:消警告与正常显示
Perl调试器宽字符问题解决方案
测试代码
#!/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}'
1. 消除p命令的“Wide character in print”警告
这个警告是因为调试器的输出句柄$DB::OUT未设置UTF-8编码,导致宽字符输出时触发检查。有两种处理方式:
- 临时生效(仅当前调试会话)
在调试器提示符下执行:
DB<1> binmode $DB::OUT, ':utf8'
之后再用p $var就能正常输出,不会再弹出警告。
- 永久生效(所有调试会话)
创建或编辑用户主目录下的.perldb文件,添加以下内容:
$DB::OUT->binmode(':utf8');
每次启动调试器时会自动应用这个编码设置。
2. 让x命令显示原文本而非Unicode编码
x命令底层依赖Data::Dumper模块,默认会把非ASCII字符转义成Unicode编码格式。调整相关参数就能显示原文本:
- 临时生效(仅当前会话)
在调试器中执行:
DB<1> $DB::pretty = 1
或者更精准地控制Data::Dumper的输出:
DB<1> $Data::Dumper::Useqq = 0; $Data::Dumper::Terse = 1; $Data::Dumper::Indent = 0
设置完后再执行x $var,就能看到:
0 'Здравствуйте'
- 永久生效(所有会话)
在.perldb文件中添加:
$DB::pretty = 1; # 或者使用Data::Dumper的具体配置 $Data::Dumper::Useqq = 0; $Data::Dumper::Terse = 1; $Data::Dumper::Indent = 0;
内容的提问来源于stack exchange,提问作者user4035
相关产品推荐
相关产品推荐

