使用data :: dumper PERL打印输出时不重视口音

时间:2014-04-01 09:28:34

标签: perl hash associative data-dumper

我想打印出关联数组的内容。 为此,我正在使用Data :: dumper。

因此,例如,如果关联数组被称为“%w”,我写道:

  print OUT Dumper(\%w);

问题在于:有一些像“récente”这样的词被打印成“récente”。

如果我只写:

print OUT %w;

我没有问题,所以“récente”会打印成“récente”。

脚本使用的所有文本文件都在utf8中。 此外,我使用模块“utf8”,我总是指定字符编码系统。

对于前。 :

open( IN, '<', $file_in);
binmode(IN,":utf8");

我很确定问题与Data :: dumper有关。有没有办法解决这种或其他方式打印出关联数组的内容?

谢谢。

4 个答案:

答案 0 :(得分:4)

这是故意的。 Data::Dumper的输出旨在在eval作为Perl代码时生成相同的数据结构。要限制字符编码的效果,将使用转义转储非ASCII字符。除此之外,设置$Data::Dumper::Useqq = 1以便使用转义转储所有不可打印的字符是明智的。

Data::Dumper并不意味着显示数据结构 - 如果您有特定的格式要求,只需自己编写必要的代码即可。例如

use utf8;
use feature 'say';
open my $out, ">:utf8", $filename or die "Can't open $filename: $!";
my %hash = (
    bárewørdş => '–Uni·code–',
);

say { $out } "{";
for my $key (sort keys %hash) {
    say { $out } "  $key: $hash{$key}";
}
say { $out } "}";

产生

{
  bárewørdş: –Uni·code–
}

答案 1 :(得分:2)

您还可以使用 Data :: Dumper :: AutoEncode

use utf8;
use Data::Dumper::AutoEncode;

warn eDumper($hash_ref);

cpan Data::Dumper::AutoEncode

答案 2 :(得分:0)

这对我有用:

use strict;
use warnings;
use Data::Dumper;
$Data::Dumper::Useperl = 1;
binmode STDOUT, ":utf8";
{ no warnings 'redefine';
    sub Data::Dumper::qquote {
        my $s = shift;
        return "'$s'";
    }
}
my $s = "rcente\x{3a3}";
my %w = ($s=>12);
print Dumper(\%w), "\n";

答案 3 :(得分:0)

Data :: Dumper是一个调试工具。它让你知道字符串包含什么,而不会使编码错误。这不是问题,这是一个功能。它发出的内容("r\x{e9}cente")是您所拥有的字符串(72 E9 63 65 6E 74 65)的足够可读表示。