The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.


Data::Tersify - generate terse equivalents of complex data structures


This is version 1.003 of Data::Tersify.


 use Data::Dumper;
 use Data::Tersify qw(tersify);
 my $complicated_data_structure = ...;
 print Dumper(tersify($complicated_data_structure));
 # Your scrollback is not full of DateTime, DBIx::Class, Moose etc.
 # spoor which you weren't interested in.


Complex data structures are useful; necessary, even. But they're not helpful. In particular, when you're buried in the guts of some code you don't fully understand and you have a variable you want to inspect, and you say x $foo in the debugger, or print STDERR Dumper($foo) from your code, or something very similar with the dumper module of your choice, and you then get pages upon pages of unhelpful stuff because $foo contained, somewhere one or more references to a DateTime, DBIx::Class, Moose or other verbose object ... you didn't need that.

Data::Tersify looks at any data structure it's given, and if it finds a blessed object that it knows about, anywhere, it replaces it in the data structure by a terser equivalent, designed to (a) not use up all of your scrollback, but (b) be blatantly clear that this is not the original object that was in that data structure originally, but a terser equivalent.

Do not use Data::Tersify as part of any serialisation implementation! By design, Data::Tersify is lossy and will throw away information! That's because it supposes that that if you're using it, you want to dump information about a complex data structure, and you don't care about the fine details.

If you find yourself saying x $foo in the debugger a lot, consider adding Data::Tersify::perldb to your .perldb file, or something like it.


 In: $data_structure
 In: $terser_data_structure

Supplied with a data structure, returns a data structure with the complicated bits summarised. Every attempt is made to preserve those parts of the data structure that don't need summarising.

Objects are only summarised if (1) they're blessed objects, (2) they're not the root structure passed to tersify (so if you actually to want to dump a complex DBIx::Class object, for instance, you still can), and (3) a plugin has been registered that groks that type of object, or they contain as an element one such object.

Summaries are either scalar references of the form "Classname (refaddr) summary", e.g. "DateTime (0xdeadbeef) 2017-08-15 12:34:56", blessed into the Data::Tersify::Summary class, or copies of the object's internal state with any sub-objects tersified as above, blessed into the Data::Tersify::Summary::Foo::0xrefaddr class, where Foo is the class the object was originally blessed into and refaddr the object's original address.

So, if you had the plugin Data::Tersify::Plugin::DateTime installed, passing a DateTime object to tersify would return that same object, untouched; but passing

     name        => 'Now',
     description => 'The time it currently is, not a time in the future',
     datetime    => DateTime->now

to tersify would return something like this:

    name        => 'Now',
    description => 'The time it currently is, not a time in the future',
    datetime    => bless \"DateTime (0xdeadbeef) 2018-08-12 17:15:00",

If the hashref had been blessed into the class "Time::Description", and had a refaddr of 0xcafebabe, you would get back a hash as above, but blessed into the class Data::Tersify::Summary::Time::Description::0xcafebabe.

Note that point 2 above (objects aren't tersified if they're the root structure) applies only to plugins. If the object contains other objects that could be tersified, they will be. One design consequence of this is that you should consider writing plugins for multiple types of object, rather than the ur-object that they might be part of.


 In: @data_structures
 Out: @terser_data_structures

A simple wrapper around "tersify" that expects to be passed one or more variables. Note that as each value is passed to "tersify", none of the values in @data_structures will be tersified if they're objects recognised by plugins. (Whereas they would have been if you'd said tersify(\@data_structures).

This is intended to be used by e.g. the Perl debugger's x command.


Data::Tersify can be extended by plugins. See Data::Tersify::Plugin for a general description of plugins; for examples of plugins, see Data::Tersify::Plugin::DateTime and Data::Tersify::Plugin::DBIx::Class, provided in separate distributions.


This is free software; you can redistribute it and/or modify it under the same terms as Perl 5.


If you find any bugs, or have any feature suggestions, please report them via github.


Data::Printer will tersify data structures as part of its standard output.