Data::Dumper и текст в UTF-8

Если вы работаете со сложными структурами данных (массивы хешей, хеши массивов и т.п.), наверняка вы используете для отладки модуль Data::Dumper. Все бы хорошо, но этот модуль категорически не хочет работать с символами в кодировке UTF-8, его вывод выглядит примерно так:

'country' => "\x{420}\x{43e}\x{441}\x{441}\x{438}\x{44f}",
'city' => "\x{41c}\x{43e}\x{441}\x{43a}\x{432}\x{430}",
'airport' => "\x{414}\x{43e}\x{43c}\x{43e}\x{434}\x{435}\x{434}\x{43e}\x{432}\x{43e}",
'code' => 'DME'

Чтобы сделать вывод функции Dumper читаемым, надо просто добавить в программу вот такой кусочек кода:

$Data::Dumper::Useqq = 1;

{ no warnings 'redefine';
sub Data::Dumper::qquote {
my $s = shift;
return "'$s'";
}
}

Тогда вывод будет выглядеть совсем по другому:

'country' => 'Россия',          
'city' => 'Москва',
'terminal' => '',
'airport' => 'Домодедово',
'code' => 'DME'

Data::Dumper и текст в UTF-8: 8 комментариев

  1. perl 5.8.9
    у меня это не работает
    хотя тоже этот способ увидел на perlmonks, но что-то никак (((

  2. Кстати, все работает, я косякнул – написал Dumper::Data::qqoute вместо Dumper::Data::qquote
    Щас исправил, все заработало

  3. Хорошие советы – как классика, никогда не стареют.
    21 век, *ля

  4. Проблема в том, что используется XS версия.
    Чтобы ее отключить надо добавить

    $Data::Dumper::Useperl = 1;

  5. До сих пор актуально, спасибо!

  6. Можно еще так:
    use utf8;
    use strict;
    use warnings;

    use Data::Dumper;
    my $data = {
    ‘country’ => ‘Россия’,
    ‘city’ => ‘Москва’,
    ‘terminal’ => ”,
    ‘airport’ => ‘Домодедово’,
    ‘code’ => ‘DME’
    };

    my $dump = Dumper($data);
    $dump =~ s/\\x\{([a-f0-9]{2,})\}/chr(hex($1))/ge;
    print $dump;

Обсуждение закрыто.