How do I create a hash of hashes in Perl?

后端 未结 5 868
轮回少年
轮回少年 2021-01-18 05:26

Based on my current understanding of hashes in Perl, I would expect this code to print \"hello world.\" It instead prints nothing.

%a=();

%b=();
$b{str} = \         


        
相关标签:
5条回答
  • 2021-01-18 06:06
    1. You should always use "use strict;" in your program.

    2. Use references and anonymous hashes.

    use strict;use warnings;
    my %a;
    
    my %b;
    $b{str} = "hello";  
    $a{1}={%b};
    
    %b=();
    $b{str} = "world";
    $a{2}={%b};
    
    print "$a{1}{str}  $a{2}{str}";
    

    {%b} creates reference to copy of hash %b. You need copy here because you empty it later.

    0 讨论(0)
  • 2021-01-18 06:08

    Perl likes to flatten your data structures. That's often a good thing...for example, (@options, "another option", "yet another") ends up as one list.

    If you really mean to have one structure inside another, the inner structure needs to be a reference. Like so:

    %a{1} = { %b };  
    

    The braces denote a hash, which you're filling with values from %b, and getting back as a reference rather than a straight hash.

    You could also say

    $a{1} = \%b;   
    

    but that makes changes to %b change $a{1} as well.

    0 讨论(0)
  • 2021-01-18 06:15

    Hashes of hashes are tricky to get right the first time. In this case

    $a{1} = { %b };
    ...
    $a{2} = { %b };
    

    will get you where you want to go.

    See perldoc perllol for the gory details about two-dimensional data structures in Perl.

    0 讨论(0)
  • 2021-01-18 06:23

    Mike, Alexandr's is the right answer.

    Also a tip. If you are just learning hashes perl has a module called Data::Dumper that can pretty-print your data structures for you, which is really handy when you'd like to check what values your data structures have.

    use Data::Dumper;
    print Dumper(\%a); 
    

    when you print this it shows

    $VAR1 = {
              '1' => {
                       'str' => 'hello'
                     },
              '2' => {
                       'str' => 'world'
                     }
            };
    
    0 讨论(0)
  • 2021-01-18 06:28

    Short answer: hash keys can only be associated with a scalar, not a hash. To do what you want, you need to use references.

    Rather than re-hash (heh) how to create multi-level data structures, I suggest you read perlreftut. perlref is more complete, but it's a bit overwhelming at first.

    0 讨论(0)
提交回复
热议问题