This example Perl program demonstrates how to use and reference pointers in multi-dimensional Perl arrays and hashes. A hash is a table of key=value data pairs, and it is described in Perl with a name-preceding '%' sign. A perl array is simply a list of items and is described with a name-preceding '@' sign. In both cases, calling the structure with a preceding '\' backslash gives access to the pointer instead of the data itself.

#!/usr/bin/perl
########################################################
# How to build multi-dimensional arrays in Perl, then  #
# access hash & array pointers with their data behind. #
# 20070928 frank4dd                                    #
########################################################

print "----------------------------------------------\n";
print "test multi-layered array and hash referencing \n";
print "----------------------------------------------\n";

# create inner hash 1
################################
%myhash1 = ('h1key1', 'h1value1', 'h1key2', 'h1value2', 'h1key3', 'h1value3');

$testkey = "h1key5";
$testvalue = "h1value5";

$myhash1{$testkey} = "$testvalue";

print "test new value: $myhash1{$testkey}\n";

# create inner hash 2
################################
%myhash2 = ('h2key1', 'h2value1', 'h2key2', 'h2value2', 'h2key3', 'h2value3');

# create outer array 1 and add
# pointer to the 2 inner hashes
################################
@myarray1 = (\%myhash1, \%myhash2);

# create outmost array 2 and add
# pointer to the inner array 1
################################
@myarray2 = (\@myarray1);

print "Content of first element in myarray2: ".$myarray2[0]."\n";
print "Content of first element in myarray1: ".$myarray2[0][0]."\n";
print "Content of first element in myhash1: ".$myarray2[0][0]->{'h1key1'}."\n";

print "Add to myhash1: key=h1key4 value=h1value4\n";
$myhash1{'h1key4'} = 'h1value4';

print "Content of last element in myhash1: ".$myarray2[0][0]->{'h1key4'}."\n";

print "----------------------------------------------\n";
print "array and hash pointer dereferencing in loops \n";
print "----------------------------------------------\n";

# dereference pointers in a loop
#################################

$i=1;
$j=1;
$k=1;

foreach $outmost_data (@myarray2) {

  print "Content of $i element in myarray2: ".$outmost_data."\n";
  $i++;
  foreach $outer_data (@{$outmost_data}) {
    print "  Content of $j element in myarray1: ".$outmost_data."\n";
    $j++;
    foreach $inner_key (keys %{$outer_data}) {
      print "    Content of $k element in "
            .$outer_data.": key=".$inner_key
            ." value=".%{$outer_data}->{$inner_key}."\n";
      $k++;
    }
  }
}


print "----------------------------------------------\n";
print "build a list with pointers to multiple arrays \n";
print "----------------------------------------------\n";

# define a new, empty array
################################
@myarray3 = ();

# fill array with sample data
################################
print "myarray3 ".\@myarray3." was created\n";
foreach $count (0,1,2,3) {
  my $key = "h3key".$count;
  my $value = "h3value".$count;
  my %myhash3 = ($key, $value);
  @myarray3[$count] = (\%myhash3);
  print "  Assign myarray3 ".\@myarray3."[$count] hash ".\ %myhash3."\n";
}

print "----------------------------------------------\n";
print "Dereference array and hash to display content \n";
print "----------------------------------------------\n";

$length = @myarray3;
print "myarray3 ".\@myarray3." has $length entries\n";

foreach $entry (@myarray3) {
  print "  Entry: $entry ";
  foreach $key (keys %{$entry}) {
    print "key=$key value=".%{$entry}->{$key}."\n";
  }
}

print "----------------------------------------------\n";
print " End of Perl Pointer Reference example script \n";
print "----------------------------------------------\n";

Below is the example output for this program:

susie112:~ # ./perl-pointer-reference.pl 
----------------------------------------------
test multi-layered array and hash referencing 
----------------------------------------------
test new value: h1value5
Content of first element in myarray2: ARRAY(0x82b6004)
Content of first element in myarray1: HASH(0x82b5e04)
Content of first element in myhash1: h1value1
Add to myhash1: key=h1key4 value=h1value4
Content of last element in myhash1: h1value4
----------------------------------------------
array and hash pointer dereferencing in loops 
----------------------------------------------
Content of 1 element in myarray2: ARRAY(0x82b6004)
  Content of 1 element in myarray1: ARRAY(0x82b6004)
    Content of 1 element in HASH(0x82b5e04): key=h1key4 value=h1value4
    Content of 2 element in HASH(0x82b5e04): key=h1key2 value=h1value2
    Content of 3 element in HASH(0x82b5e04): key=h1key3 value=h1value3
    Content of 4 element in HASH(0x82b5e04): key=h1key1 value=h1value1
    Content of 5 element in HASH(0x82b5e04): key=h1key5 value=h1value5
  Content of 2 element in myarray1: ARRAY(0x82b6004)
    Content of 6 element in HASH(0x82b5f64): key=h2key2 value=h2value2
    Content of 7 element in HASH(0x82b5f64): key=h2key3 value=h2value3
    Content of 8 element in HASH(0x82b5f64): key=h2key1 value=h2value1
----------------------------------------------
build a list with pointers to multiple arrays 
----------------------------------------------
myarray3 ARRAY(0x82b6684) was created
  Assign myarray3 ARRAY(0x82b6684)[0] hash HASH(0x82b67f4)
  Assign myarray3 ARRAY(0x82b6684)[1] hash HASH(0x82b6094)
  Assign myarray3 ARRAY(0x82b6684)[2] hash HASH(0x82c3444)
  Assign myarray3 ARRAY(0x82b6684)[3] hash HASH(0x82c3454)
----------------------------------------------
Dereference array and hash to display content 
----------------------------------------------
myarray3 ARRAY(0x82b6684) has 4 entries
  Entry: HASH(0x82b67f4) key=h3key0 value=h3value0
  Entry: HASH(0x82b6094) key=h3key1 value=h3value1
  Entry: HASH(0x82c3444) key=h3key2 value=h3value2
  Entry: HASH(0x82c3454) key=h3key3 value=h3value3
----------------------------------------------
 End of Perl Pointer Reference example script 
----------------------------------------------

Source: