tags:

views:

256

answers:

7

Examples:

%hash = (2010 => 21, 2009=> 9);

$hash = {
    a => {
        0 => {test => 1},
        1 => {test => 2},
        2 => {test => 3},
        3 => {test => 4},
    },
};

How do I print the hash?

A: 

use keys , values function

@keys = keys %hash ; 

@values = values %hash 
pavun_cool
A: 

Hi

This should help:

foreach $key (keys %hash)
{
  print "key is : $key, value is : $hash{$key}\n";
}

cheers

Andriyev
Thanks for reply if my hash is like this $hash = {'a'=>{ 0=>{'test'=>'1'}, 1=>{'test'=>'2'}, 2=>{'test'=>'3'}, 3=>{'test'=>'4'} } };Then what I will do
Sourabh
A: 
printf ("%s = %s\n", $_, $hash {$_}) foreach (keys (%hash));
Jeff
+2  A: 
  while( my( $key, $value ) = each( %hash ) ) {
         ...
  }
ghostdog74
+2  A: 

instead of

%hash = { 2010=> 21, 2009=> 9 }

you should write

%hash = ( 2010=> 21, 2009=> 9 ); 

with the curly braces you get a REFERENCE to an anonymous hash, which is then stored as the first key of you %hash.

bjelli
and worse, it's stored in stringified form!
Philip Potter
yes, but in his **second** exemple the OP wrote : $h = { some content }; and **that** may be legitimate (say to pass a hash reference to a sub). (Even if you are probably right and it is a newbie mistake).
kriss
+10  A: 

Do you want to print the entire hash, or specific key, value pairs? And what is your desired result? IF it's just for debugging purposes, you can do something like:

use Data::Dumper;
print Dumper %hash; # or \%hash to encapsulate it as a single hashref entity;

You can use the each function if you don't care about ordering:

while ( my($key, $value) = each %hash ) {
    print "$key = $value\n";
}

Or the for / foreach construct if you want to sort it:

for my $key ( sort keys %hash ) {
    print "$key = $hash{$key}\n";
}

Or if you want only certain values, you can use a hash slice, e.g.:

print "@hash{qw{2009 2010}}\n";

etc, etc. There is always more than one way to do it, though it helps to know what you're frying to do first :)

Duncan
+1 excellent answer!
Philip Potter
I may be wrong but I believe the OP hash problems with syntax to access items or even hash using hash references, not with iterators on hashes. Notice than in his second exemple his variable is a scalar $hash, not a hash.
kriss
@kriss: The original question asked how to print a hash, it would appear the OP has edited the question with a further example. The first example of using Data::Dumper will still handle that correctly.
Duncan
@Duncan: Data::Dumper works everywhere. On the other hand there is more than printing data ;-)
kriss
@kriss: There is more to printing a hash than printing data? The question is "How do I print a hash structure in Perl?" :)
Duncan
@Duncan: control print formatting ? ;-)
kriss
+2  A: 

Syntax to access inner cells for your second example is like:

print $hash->{"a"}{0}{"test"}

That will give you 1 in your example.

If you want to iterate on it, you can do it as follows (print lines are for illustration purposes):

my $hash = {"a"=>{ 0=>{"test"=>1}, 1=>{"test"=>2}, 2=>{"test"=>3}, 3=>{"test"=>4} } };
print "Direct access to item : ".$hash->{"a"}{1}{"test"}."\n";

foreach my $k1 (keys(%$hash)) {
    print "keys of level 1: $k1\n";
    foreach my $k2 (keys(%{$hash->{$k1}})) {
        print "keys of level 2: $k2\n";
        print "values: ".$hash->{$k1}{$k2}{"test"}."\n"
     }
}

Notice that things are a bit more tricky than necessary because the external $hash is a scalar reference to an anonymous hash. It would be simpler if it was a hash (i.e., like in my %hash = (1, 2); print $hash{1};).

(TIMTOWTDI: there is obviously more than one way to do it; I believe the above example is the simplest for me, but not the most efficient; using each instead of keys for iterating would avoid one unnecessary hash lookup).

kriss
thanks kriss... its working fine :)
Sourabh
Most programmers do not write double sigils and repeated arrows. This notation is much more readable: `$hash->{'a'}{0}{'test'}`
daxim
@daxim: yes, i tried to make it more explicit for beginner but I probably failed on this one. I will change it.
kriss
@kriss: Recursion is probably too advanced at this stage?
Duncan
@Duncan: probably, but I don't really see where you want to put recursion in that question ? Some example on how to use hashes to make trees or graphs ?
kriss