如何使Devel :: REPL输出人类可读的Unicode?

时间:2013-11-25 18:50:40

标签: perl unicode read-eval-print-loop

我使用Devel::REPL。转储结构时,它当前使用一些转义符,如\x{17d},用于字符串中的重音字符。如何让它直接输出UTF-8?这是一个例子:

$ re.pl
$ {'žůžo' => ['bříško']}
$HASH1 = { "\305\276\305\257\305\276o" => [ "b\305\231\303\255\305\241ko" ] };

有趣的是,只需输入字符串即可直接输出:

$ re.pl
$ 'žůžo'
žůžo

这应该是“裸骨”版本:

$ perl -MDevel::REPL -e 'my $repl = Devel::REPL->new; $repl->load_plugin("DDS"); $repl->run'
$ {'žůžo' => ['bříško']}
$HASH1 = { "\305\276\305\257\305\276o" => [ "b\305\231\303\255\305\241ko" ] };

所以看起来Data::Dump::Streamer是罪魁祸首,但我没有进一步发展。我在Data::Dumper Perl Monks处发现了一些关于Unicode的讨论,但这显然无济于事。粗略地浏览一下Data::Dump::Streamer文档并没有发现任何有趣的Unicode或猴子修补。

3 个答案:

答案 0 :(得分:2)

你不能,至少在Devel :: REPL调用Data :: Dump :: Streamer的情况下。 DDS将始终编码不在\ x20- \ x7e范围内的任何字符。

您可以修改DDS以选择其他方式。

答案 1 :(得分:2)

在阅读了DDS的来源后,我根据Perl Monks code提出了这个补丁:

$ cat quote.rc
{
    no warnings 'redefine';
    sub Data::Dump::Streamer::_qquote {
        my $s = shift;
        return "'$s'";
    }
}
$ re.pl --rcfile ./quote.rc
$ {'žůžo' => ['bříško']}
$HASH1 = { 'žůžo' => [ 'bříško' ] };

我不知道改变会破坏什么,但由于我的用例非常简单,我对这个黑客很满意。如果我的房子因此被烧毁,我会发布更新。

答案 2 :(得分:1)

转储程序无法知道您的字符串(C5 BE ...)是Unicode代码点的UTF-8编码。具体做法是:

  1. 无法知道字符串代表文字。
  2. 即使它确实如此,也无法知道文本是否已编码。
  3. 即使它确实如此,也无法知道所使用的编码是UTF-8。
  4. 所以你要求的是一些非常具体的数据结构。您可以根据Devel::REPL::Plugin::DDS制作自定义插件。