Below is a perl function that i wrote to print a HASH completely. What i mean by ‘completely’ is that it will expand all hashes and arrays found within the given HASH.
sub print_hash { my ($hash,$str) = @_; while( my ($k, $v) = each %{$hash}) { print $str."$k => $v\n"; if( $v =~ /hash/i ) { print_hash($v,$str."\t\t"); } if( $v =~ /array/i ) { print "$str\t\t".join(", ",@{$v})."\n"; } } }
Below is a sample script which shows the use of the above function.
#!/usr/bin/perl #-------------------------------------------------# # File: printhash.pl # # Author: Dipin Krishna mail@dipinkrishna.com # #-------------------------------------------------# sub print_hash { my ($hash,$str) = @_; while( my ($k, $v) = each %{$hash}) { print $str."$k => $v\n"; if( $v =~ /hash/i ) { print_hash($v,$str."\t\t"); } if( $v =~ /array/i ) { print "$str\t\t".join(", ",@{$v})."\n"; } } } # Initialize two arrays @array1 = (3,4,5,67,8); @array2 = ('a','d','g','h','j','l'); # Below is a hash whose has an array in it. %hash2 = ('key1' => 21, 'key2' => 22, 'key3' => 23, 'array2' => \@array2); # Below is a hash who has a hash in it. %hash1 = ('key1' => 11, 'key2' => 12, 'hash2' => \%hash2); # Now lets declare a hash which has an array and # a hash(which contains an hash(with an array) in it) in it. %hash = ( 'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3', 'array1' => \@array1, 'hash1' => \%hash1 ); # Now print the final HASH print_hash(\%hash);
Ouput:
array1 => ARRAY(0x9632c08) 3, 4, 5, 67, 8 key2 => value2 key1 => value1 hash1 => HASH(0x9632ef8) hash2 => HASH(0x9632e38) key2 => 22 key1 => 21 array2 => ARRAY(0x9632d98) a, d, g, h, j, l key3 => 23 key2 => 12 key1 => 11 key3 => value3
Hoping, it will be useful.