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} = "hello";
$a{1}=%b;
$b=();
$b{str} = "world";
$a{2}=%b;
print "$a{1}{str} $a{2}{str}";
I assume that a hash is just like an array, so why can't I make a hash contain another?
You should always use "use strict;" in your program.
Use references and anonymous hashes.
{%b}
creates reference to copy of hash%b
. You need copy here because you empty it later.Hashes of hashes are tricky to get right the first time. In this case
will get you where you want to go.
See
perldoc perllol
for the gory details about two-dimensional data structures in Perl.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.
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:
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
but that makes changes to %b change $a{1} as well.
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.
when you print this it shows