Акценты не учитываются при выводе с помощью data::dumper PERL

Я хотел бы распечатать содержимое ассоциативного массива. Для этого я использую 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. Есть ли способ решить этот или другой способ распечатать содержимое ассоциативного массива?

Спасибо.


person KeyPi    schedule 01.04.2014    source источник
comment
Меня немного беспокоит, что вы говорите об ассоциативных массивах. С момента выпуска Perl 5 почти двадцать лет назад мы называли их хэшами. Если вы читаете учебники или книги, которые до сих пор называют их ассоциативными массивами, то информация, которую вы получаете, ужасно устарела.   -  person Dave Cross    schedule 01.04.2014
comment
Я почти уверен, что проблема связана с Data::dumper. Какая проблема? Re Есть ли способ решить этот или другой способ распечатать содержимое ассоциативного массива? Конечно, вы можете распечатать его любым удобным для вас способом.   -  person ikegami    schedule 01.04.2014


Ответы (4)


Это сделано намеренно. Вывод Data::Dumper предназначен для создания той же структуры данных, когда evaluated как код Perl. Чтобы ограничить влияние кодировок символов, символы, отличные от ASCII, будут сбрасываться с помощью escape-последовательности. В дополнение к этому имеет смысл установить $Data::Dumper::Useqq = 1 так, чтобы все непечатаемые символы выводились с помощью escape-последовательности.

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–
}
person amon    schedule 01.04.2014
comment
Спасибо ! ты на перле 5 пишешь? - person KeyPi; 01.04.2014
comment
@user3025314 user3025314 да, это код Perl5 (для perl ›= 5.10). Теперь я добавил строку, чтобы сделать ее действительно работоспособной. - person amon; 01.04.2014

Вы также можете использовать Data::Dumper::AutoEncode.

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

warn eDumper($hash_ref);

cpan Data::Dumper::AutoEncode

person Fotis_zzz    schedule 01.04.2014

Это работает для меня:

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";
person perreal    schedule 01.04.2014

Data::Dumper — это инструмент отладки. Это позволяет узнать, что содержит строка, не делая ее восприимчивой к ошибкам кодирования. Это не проблема, это особенность. То, что он выдал ("r\x{e9}cente"), является достаточно читаемым представлением строки, которая у вас была (72 E9 63 65 6E 74 65).

person ikegami    schedule 01.04.2014