%{%$excel_hash{$keys1} }
is redundant.
Work from the inside.
-
You start in that expression with a reference to a hash: $excel_hash
-
Then you dereference it into a hash with %$excel_hash (better written as %{ $excel_hash }
-
Then you get the value of one of the keys in the hash (with the key name held in the scalar $keys1), using %$excel_hash{$keys1} (somewhat better written as %{ $excel_hash }{ $keys1 }.)
-
Then you take the hash that is returned by what you got so far, and take a reference to it, by enclosing in braces: { %$excel_hash{$keys1} }
-
Finally, you dereference the new reference you made, to get back to two steps earlier, with
%{%$excel_hash{$keys1} }
Let's start again. Say you have a hash reference $excel_href. (Note you should name it with 'href' since it is not a hash, but a scalar that holds a reference to the hash.) Now you want to loop through the keys, so make it easy on yourself and deference the hashref at the start.
my %excel_hash = %{ $excel_href };
Loop through the keys, using for, which is the same as for each:
for my $key ( keys %excel_hash ) {
...
}
So now you have the key, and you need the value, and we know that the value is going to be a "sub-hash", ie a scalar holding a reference to another hash. Since we're lazy and we don;t like typing arrows, and for consistency, we can dereference this hashref, too, and we'll do it right after we fetch the value:
for my $key ( keys %excel_hash ) {
my $inner_href = $excel_hash{ $key };
my %inner_hash = %{ $inner_href };
}
Finally, you want to get the value of the key named 'Name' in the inner hash.
for my $key ( keys %excel_hash ) {
my $inner_href = $excel_hash{ $key };
my %inner_hash = %{ $inner_href };
my $name = $inner_hash{'Name'};
}
Or, for a version more similar to yours:
for my $key1 ( sort keys %{ $excel_href } ) {
while ( my ( $key2, $val2 ) = each %{ $excel_href->{ $key1 } } ) {
print "$key2 = $value \n";
}
}
Or, for a version sticking to simple for loops (each should be handled with care):
for my $outer_key ( keys %{ $excel_href } ) {
print "$outer_key:";
for my $inner_key ( keys %{ $excel_href->{ $outer_key } } ) {
print "\t$inner_key = $excel_href->{ $outer_key }->{ $inner_ke
+y }\n";
}
}
Or, for the convenient way using map (assuming you know the name of the inner key you are trying to read):
print "$_\n" for map {"$_: Name = $excel_href->{ $_ }->{'Name'}"} keys
+ %{ $excel_href };
I expect all this is clear as mud at first reading, but have a play around and it should start making sense. Post back here with any questions.
The way forward always starts with a minimal test.
|