Also keep in mind that the first scenario specifies a reference to a variable, other_hash. So, you now have two or more references to the same chunk of storage. (Fortran calls that EQUIVALENCE.)
Data::Dumper makes this clear. Consider this:
use strict; use warnings;
use Data::Dumper;
my @a = (1, 2); my $b = { "c"=>\@a };
print Dumper(\@a, $b);
$b->{"c"}[0]=4;
print Dumper(\@a, $b);'
(gives...)
$VAR1 = [
1,
2
];
$VAR2 = {
'c' => $VAR1
};
$VAR1 = [
4,
2
];
$VAR2 = {
'c' => $VAR1
};
The dumper knows that the hash-key points to the same block of storage that the array-variable does, so it refers to it in the second case by its name. And you can see how a change, made by means of the hash-key, changed the value in the array variable, because the two are the same. This is a very easy mistake to make in a production setting.
Also note that “references” will work in this way, whether-or-not a particular reference comes into existence by means of the “autovivification” feature.
|