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
You must be logged in to post a comment.