Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask

Re^6: excel to hash

by 1nickt (Monsignor)
on Sep 13, 2017 at 21:19 UTC ( #1199350=note: print w/replies, xml ) Need Help??

in reply to Re^5: excel to hash
in thread excel to hash

Hi again,


%{%$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.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1199350]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (6)
As of 2018-05-23 15:28 GMT
Find Nodes?
    Voting Booth?