Recipe 11.11 Printing Data Structures

11.11.1 Problem

You want to print out a data structure.

11.11.2 Solution

If the output's legibility and layout are important, write your own custom printing routine.

If you are in the Perl debugger, use the x command:

DB<1> $reference = [ { "foo" => "bar" }, 3, sub { print "hello, world\n" } ]; DB<2> x $reference    0  ARRAY(0x1d033c)      0  HASH(0x7b390)         'foo' = 'bar'      1  3      2  CODE(0x21e3e4)         -> &main::_ _ANON_ _[(eval 15)[/usr/local/...perl5db.pl:17]:2]          in (eval 15)[/usr/local/.../perl5db.pl:17]:2-2 

From within your own programs, use the Dumper function from the standard module Data::Dumper:

use Data::Dumper; print Dumper($reference);

Or if you'd like output formatted in the same style as the Debugger uses:

use Dumpvalue; Dumpvalue->new->dumpValue($reference);

11.11.3 Discussion

Sometimes you'll want to make a dedicated function for your data structure that delivers a particular output format, but often this is overkill. If you're running under the Perl debugger, the x and X commands provide nice pretty-printing. The x command is more useful because it works on both global and lexical variables, whereas X works only on globals. Pass x a reference to the data structure you want to print.

DB<3> x @INC    0  ARRAY(0x807d0a8)       0  '/home/tchrist/perllib'        1  '/usr/lib/perl5/i686-linux/5.00403'       2  '/usr/lib/perl5'        3  '/usr/lib/perl5/site_perl/i686-linux'        4  '/usr/lib/perl5/site_perl'        5  '.' 

The standard Dumpvalue module provides the Debugger's output formatting using an object-oriented interface. Here's an example:

use Dumpvalue; Dumpvalue->new->dumpvars("main", "INC"); @INC = (    0  '/usr/local/lib/perl5/5.8.1/OpenBSD.i386-openbsd'    1  '/usr/local/lib/perl5/5.8.1'    2  '/usr/local/lib/perl5/site_perl/5.8.1/OpenBSD.i386-openbsd'    3  '/usr/local/lib/perl5/site_perl/5.8.1'    4  '/usr/local/lib/perl5/site_perl/5.8.0/OpenBSD.i386-openbsd'    5  '/usr/local/lib/perl5/site_perl/5.8.0'    6  '/usr/local/lib/perl5/site_perl'    7  '.' ) %INC = (    'Dumpvalue.pm' = '/usr/local/lib/perl5/5.8.1/Dumpvalue.pm'>    'strict.pm' = '/usr/local/lib/perl5/5.8.1/strict.pm'> )

which is like using the V main INC command in the Debugger. All the output formatting options from the Debugger are available from Dumpvalue. Just pass Dumpvalue->new option pairs:

$dobj = Dumpvalue->new(option1 => value1, option2 => value2);

Options available as of v5.8.1 include arrayDepth, hashDepth, compactDump, veryCompact, globPrint, dumpDBFiles, dumpPackages, dumpReused, tick, quoteHighBit, printUndef, usageOnly, unctrl, subdump, bareStringify, quoteHighBit, and stopDbSignal.

The Data::Dumper module, also included in the standard Perl distribution, has a different approach. It provides a Dumper function that takes a list of references and returns a string with a printable (and evalable) form of those references.

use Data::Dumper; print Dumper(\@INC);  $VAR1 = [ '/usr/local/lib/perl5/5.8.1/OpenBSD.i386-openbsd', '/usr/local/lib/perl5/5.8.1', '/usr/local/lib/perl5/site_perl/5.8.1/OpenBSD.i386-openbsd', '/usr/local/lib/perl5/site_perl/5.8.1', '/usr/local/lib/perl5/site_perl/5.8.0/OpenBSD.i386-openbsd', '/usr/local/lib/perl5/site_perl/5.8.0', '/usr/local/lib/perl5/site_perl', '.' ];

Data::Dumper supports a variety of output formats. Check its documentation for details. Particularly useful is the option to decompile Perl code:

use Data::Dumper; $Data::Dumper::Deparse = 1; $a = sub { print "hello, world\n" }; print Dumper($a); $VAR1 = sub {                   print 'hello, world';               };

11.11.4 See Also

The documentation for Data::Dumper; Chapter 20 of Programming Perl or perldebug(1)



Perl Cookbook
Perl Cookbook, Second Edition
ISBN: 0596003137
EAN: 2147483647
Year: 2003
Pages: 501

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net