2.5 Printing Complex Data Structures

Sometimes you need to look inside your complex data structures to see what the settings are. One of the most useful ways to examine a data structure is by means of the Data::Dumper module. This module comes standard with all recent versions of Perl.

Here is the summary and part of the synopsis and description as output from the perldoc Data::Dumper command:

NAME
       Data::Dumper - stringified perl data structures, suitable
       for both printing and "eval"

SYNOPSIS
           use Data::Dumper;

           # simple procedural interface
           print Dumper($foo, $bar);
(...)

DESCRIPTION
       Given a list of scalars or reference variables, writes out
       their contents in perl syntax. The references can also be
       objects.  The contents of each variable is output in a
       single Perl statement.  Handles self-referential strucTures correctly.

       The return value can be "eval"ed to get back an identical
       copy of the original reference structure.
(...)

This output of a two-dimensional array illustrates its use:

use Data::Dumper;

$array = [  ];

# Initialize the array
for($i=0; $i < 4 ; ++$i) {
  for($j=0; $j < 4 ; ++$j) {
      $array->[$i][$j] = $i * $j;
  }
}

# Print the array "by hand"
for($i=0; $i < 4 ; ++$i) {
  for($j=0; $j < 4 ; ++$j) {
      printf("%3d ", $array->[$i][$j]);
  }
  print "\n";
}

# Print the array using Data::Dumper
print Dumper($array);

This produces the output:

  0   0   0   0 
  0   1   2   3 
  0   2   4   6 
  0   3   6   9 
$VAR1 = [
          [
            0,
            0,
            0,
            0
          ],
          [
            0,
            1,
            2,
            3
          ],
          [
            0,
            2,
            4,
            6
          ],
          [
            0,
            3,
            6,
            9
          ]
        ];

You can make a nicer display by knowing exactly what the data is and in what form to write it out. Data::Dumper can also display the data in a fairly readable format (and there are several options as to how the data is displayed). In addition, Data::Dumper allows you to dump a data structure out to a file and then read it in to another program. See the perldoc Data::Dumper manpage for more details.

You can also print out an array of arrays @array by printing each row one at a time. Remember that each row is an anonymous array, so each entry of the @array array is a reference to an anonymous array:

@array = (
  [0, 0, 0, 0], 
  [0, 1, 2, 3], 
  [0, 2, 4, 6], 
  [0, 3, 99, 9] 
);

for $anon (@array) {
  print "@$anon\n";
}

See the Perl perllol reference page for more information on initializing and printing arrays of arrays.