Perl — замена Data::Dumper’у

Data::Dumper прекрасный модуль, но и он имеет недостатки. 1) большой, 2) сложный, 3) русские буквы выводит как escaped строки, а поправить это сложно. Модуль хороший, но слишком умный. А отладка требует простоты.

Альтернатива - модуль Data::Dump, автор Gisle Aas. Автор указан, чтобы подчеркнуть, что этот модуль не поделка начинающего перл-программиста, не дошедшего до Data::Dumper.

Особенность Data::Dump по сравнению с Data::Dumper ещё и в том, что он пораждает более компактный фариант дампа, выводя короткие массивы в одной строке.

Возможно, замена quote на мою версию вызовет проблемы при обратной интерпретации дампа, но для целей отладки это несущественно, а вот короткий вывод массивов очень приветствуется.

Определены функции dump, pp, dd, ddx и другие. ddx выводит дамп с указанием исходной строки - места вызова. Ниже пример вывода, который она генерит.

При выводе дампа больших объектов у Data::Dumper есть проблема - гигантские дампы. Проблему, опять же, решить можно, но Data::Dump позволяет сделать это проще - он предоставляет функцию dumpx, принимающую последним аргументом callback функцию, позволяющую изменять выводимые в дамп данные.

Кроме вывода дампов, Data::Dump предоставляет интересный вариант трассировки, но это более сложная тема. Может быть, его трассировочные возможности даже более интересные, чем основная функциональность.

Пример использования:

[cc lang='perl' ]
#!perl -w
use strict;
use warnings;
use utf8;

use Data::Dump qw(dump dd ddx);

my %data = (
    0 => '1',
    1 => 'English chars',
    2 => 'Русские буквы йцукенгшщзхъфывапролджэячсмитьбюё',
    'Русские буквы йцукенгшщзхъфывапролджэячсмитьбюё' => '2',
    3 => {
        1 => '1',
        2 => '2',
    },
    4 => [
        1 => '1',
        2 => '2',
    ],
);

{
    local *Data::Dump::quote = sub { return qq("$_[0]"); };
    ddx( \%data );
}

{
    ddx( \%data );
}
[/cc]

Результат: первый вариант с новой функцией escape, второй вариант - со встроенной.

# test.pl:50: {
#   "0" => 1,
#   "1" => "English chars",
#   "2" => "Русские буквы йцукенгшщзхъфывапролджэячсмитьбюё",
#   "3" => { 1 => 1, 2 => 2 },
#   "4" => [1, 1, 2, 2],
#   "Русские буквы йцукенгшщзхъфывапролджэячсмитьбюё" => 2,
# }
# test-Data-Dump.pl:55: {
#   "0" => 1,
#   "1" => "English chars",
#   "2" => "\x{420}\x{443}\x{441}\x{441}\x{43A}\x{438}\x{435} \x{431}\x{443}\x{43A}\x{432}\x{44B} \x{439}\x{446}\x{443}\x{43A}\x{435}\x{43D}\x{433}\x{448}\x{449}\x{437}\x{445}\x{44A}\x{444}\x{44B}\x{432}\x{430}\x{43F}\x{440}\x{43E}\x{43B}\x{434}\x{436}\x{44D}\x{44F}\x{447}\x{441}\x{43C}\x{438}\x{442}\x{44C}\x{431}\x{44E}\x{451}",
#   "3" => { 1 => 1, 2 => 2 },
#   "4" => [1, 1, 2, 2],
#   "\x{420}\x{443}\x{441}\x{441}\x{43A}\x{438}\x{435} \x{431}\x{443}\x{43A}\x{432}\x{44B} \x{439}\x{446}\x{443}\x{43A}\x{435}\x{43D}\x{433}\x{448}\x{449}\x{437}\x{445}\x{44A}\x{444}\x{44B}\x{432}\x{430}\x{43F}\x{440}\x{43E}\x{43B}\x{434}\x{436}\x{44D}\x{44F}\x{447}\x{441}\x{43C}\x{438}\x{442}\x{44C}\x{431}\x{44E}\x{451}" => 2,
# }

Leave a Reply