| Search perlmeme.org | |
| Home » Faqs » Perl variables » Print hash within hash |
You have a hash, within which one element is a reference to another hash:
my %hash = (
a => {
1 => "one",
2 => "two",
3 => "three",
},
b => {
4 => "four",
5 => "five",
6 => "six",
},
);
There are two simple ways to approach this. Firstly you could use embedded 'for' loops:
#!/usr/bin/perl -w
use strict;
my %hash = (
a => {
1 => "one",
2 => "two",
3 => "three",
},
b => {
4 => "four",
5 => "five",
6 => "six",
},
);
foreach my $line (keys %hash) {
print "$line: \n";
foreach my $elem (keys %{$hash{$line}}) {
print " $elem: " . $hash{$line}->{$elem} . "\n";
}
}
exit 0;
This produces the following output:
a:
1: one
2: two
3: three
b:
4: four
5: five
6: six
A simple solution, if you only need to output the data, is to use a module called Data::Dumper. This module will handle very complex data structures, and will even nicely handle recursive references (an element in the hash points to a hash, in which an element points back to the first hash). Data::Dumper handles hashes, arrays, and combinations of both.
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my %hash = (
a => {
1 => "one",
2 => "two",
3 => "three",
},
b => {
4 => "four",
5 => "five",
6 => "six",
},
);
print Dumper(\%hash);
exit 0;
This produces the following output:
$VAR1 = {
'a' => {
'1' => 'one',
'2' => 'two',
'3' => 'three'
},
'b' => {
'4' => 'four',
'5' => 'five',
'6' => 'six'
}
};
As you can see, the output of Data::Dumper looks like real code. You can eval the output of Data::Dumper. This makes a nice way of transfering complex data across programs that can't be called directly (e.g. through a socket, stored in a database or stored in a file).
perldoc Data::Dumper
perldoc perldsc