in reply to Forcing dereference
Just trying to explain the "why".
It does prevent you from messing up $foo (and %$foo, including $foo->{'SOMETHING_01'}), but it doesn't prevent you from messing up that to which $foo->{'SOMETHING_01'} points, if $foo->{'SOMETHING_01'} is a reference. That's why you need to do a deep copy, as shown in other replies.
If that doesn't make sense, check out this example:
use Data::Dumper; { my $ref = [ 'moo' ]; my %h1 = ( key1 => 'val1', key2 => $ref ); print("$_ => $h1{$_}\n") foreach (keys(%h1)); # prints: # key1 => val1 # key2 => ARRAY(0x1abf040) print Dumper \%h1; # { # 'key1' => 'val1', # 'key2' => [ # 'moo' # ] # } my %h2 = %h1; # Shallow copy. delete($h2{'key1'}); $h2{'foo'} = 'bar'; $h2{'key2'}[0] =~ s/m/b/; print("$_ => $h1{$_}\n") foreach (keys(%h1)); # prints: # key1 => val1 # key2 => ARRAY(0x1abf040) # and not: # foo => bar # key2 => ARRAY(0x1abf040) print Dumper \%h1; # { # 'key1' => 'val1', # 'key2' => [ # 'boo' # ] # } }
Note that %h1 never changes. Only @$ref changes. It's the same as in your code. You're changing that to which $foo->{'SOMETHING_01'} points while protecting the hash ref at $foo->{'SOMETHING_01'}.
|
|---|