【问题标题】:Accents not respected in printing out with data::dumper PERL使用 data::dumper PERL 打印时不尊重口音
【发布时间】:2014-05-11 23:35:53
【问题描述】:

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

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

  print OUT Dumper(\%w);

问题出在这里:有一些像“récente”这样的词被打印为“r\x{e9}​​cente”。

如果我只写:

print OUT %w;

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

脚本使用的所有文本文件都是 utf8 格式。 此外,我使用模块“utf8”并始终指定字符编码系统。

例如。 :

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

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

谢谢。

【问题讨论】:

  • 我有点担心你在谈论“关联数组”。自从将近二十年前 Perl 5 发布以来,我们称它们为“哈希”。如果您正在阅读仍然称它们为“关联数组”的教程或书籍,那么您获得的信息已经过时了。
  • Re “我很确定问题与 Data::dumper 有关。”什么问题?回复“有没有办法解决这个问题或以其他方式打印出关联数组的内容?”当然,您可以以任何方式打印出来。

标签: perl hash associative data-dumper


【解决方案1】:

这是故意的。 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–
}

【讨论】:

  • 谢谢!你是用 perl 5 写的吗?
  • @user3025314 是的,这是 Perl5 代码(对于 perl >= 5.10)。我现在添加了一行以使其实际可运行。
【解决方案2】:

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

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

warn eDumper($hash_ref);

cpan Data::Dumper::AutoEncode

【讨论】:

    【解决方案3】:

    这对我有用:

    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";
    

    【讨论】:

      【解决方案4】:

      Data::Dumper 是一个调试工具。它让您知道字符串包含的内容,而不会使其容易受到编码错误的影响。这不是问题,这是一个特点。它发出的 ("r\x{e9}cente") 是您拥有的字符串 (72 E9 63 65 6E 74 65) 的充分可读的表示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-04
        • 2014-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-10
        • 1970-01-01
        相关资源
        最近更新 更多