使用 x 命令在 Perl 调试器中打印 utf-8 文本

问题描述 投票:0回答:1

测试文件:

#!/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
    命令后的“打印中的宽字符”警告?
  2. 如何让调试器在使用
    x
    转储变量时打印文本而不是符号代码?
perl debugging
1个回答
0
投票

请参阅此 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 中拥有修改版本。

© www.soinside.com 2019 - 2024. All rights reserved.