I wonder if this is possible and how: I have a hash of hashes %backup and I want to save it in a value of another hash of hashes, like this:
$globsessions{$session}{'backup'} = %backup;
and later on (of course) I want it back like this:
%backup = $globsessions{$session}{'backup'};
This is not working and I just lost a little here (maybe to less coffee...). The %globsessions is global in my app and should be reused.
Many thanks in advance for your help!
Edit:
Using references as Neil suggested does not work, since the child owning %backup is dead the next time I need the data thus the reference is not valid anymore. So I have more a child/parent problem than a 'copy a hashofhashes' problem. But the solution from Neil for that is properly!
You have close to the right syntax, but cannot assign a hash directly as a value in another hash. Hash values are scalars. So you need to turn your %backup into a reference.
If you want to copy the data into the new location:
$globsessions{$session}{'backup'} = { %backup };
This is a shallow copy of contents of %backup - it is less efficient, but prevents over-writing keys or values in the original variable. Caveat: It doesn't copy deep structures, so if a value in %backup is another hash or array reference, then it could be modified. Use Storable's dclone if you want to make a deep copy.
If you want to maintain a reference back to the original hash:
$globsessions{$session}{'backup'} = \%backup;
This stores a reference to %backup - it is more efficient, but if you set $globsessions{$session}{'backup'}{'foo'} = 'bar' then you also change the original %backup
To copy data back to %backup:
A shallow copy will probably suffice:
%backup = %{ $globsessions{$session}{'backup'} };
Or using a deep copy, which is slower but safer with data, and requires Storable:
%backup = %{ dclone( $globsessions{$session}{'backup'} ) };
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With