We don't bite newbies here... much | |
PerlMonks |
Re^7: Strange hash array behaviorby Util (Priest) |
on Jan 29, 2009 at 07:35 UTC ( [id://739804]=note: print w/replies, xml ) | Need Help?? |
So, why does it "work" on the first pass (without using clone) and then from there I just get a shallow copy? Short answer: it did *not* "work" on pass#1 any differently than pass#2 or pass#3. That fact is might not be evident from Data::Dumper output until one obtains mastery of Perl references (via perlreftut and perlref).
Detailed explanation: , and you wanted to explain to a fellow programmer what $arrayref pointed to, you would (of course) simply say "the array named @foo". If instead you had coded , then $arrayref would still point to equivalent data, but you could *not* describe it as a reference to a particular array named @something. The array is nameless, floating in memory as long as anyone has a reference to it, and vanishing once the last reference goes away. It is anonymous. Furthermore, if I say , then I would be (close enough to) accurate to say that the three numbers "live" in @foo, and that the 2 is stored between the 1 and the 3. If instead I code , I would be far less accurate to say that the three anonymous arrays "live" in @foo, or that the anonymous array containing 2 is stored between the anonymous array containing 1 and the anonymous array containing 3. That distinction is important. Arrays cannot hold arrays or hashes; Arrays can only contain scalars. Hash values can only contain scalars. The three anonymous arrays "live" out in space, only the *references* to them get stored (in an ordered fashion) in the @foo array. When Data::Dumper says "$VAR1->[0]{'sizes'}" in your second two passes, it does so because that string of code is the closest thing to a name it has to describe the anonymous hash it already described in the first pass. Data::Dumper cannot print simple repetitions of the anonymous hash from the first pass, because that would be describing 3 separate anonymous hashes, each (coincidentally) containing the same data elements, yet each floating in its own separate place in memory. Perhaps this simpler example will help.produces this output:
In Section
Seekers of Perl Wisdom
|
|