我想知道这是否可行以及如何:我有一个散列哈希%backup
并且我想将它保存在哈希的另一个哈希值中,如下所示:
$globsessions{$session}{'backup'} = %backup;
以及稍后(当然)我希望它回复:
%backup = $globsessions{$session}{'backup'};
这不起作用,我在这里丢了一点(可能少喝咖啡......)。 %globsessions
在我的应用中是全局的,应该重复使用。
非常感谢您的帮助!
编辑:
使用Neil建议的引用不起作用,因为下次我需要数据时拥有%backup
的孩子已经死了,因此引用不再有效。所以我有一个孩子/父母问题,而不是'复制一个hashofhashes'问题。但Neil的解决方案是正确的!
答案 0 :(得分:7)
您接近正确的语法,但不能直接将散列指定为另一个散列中的值。哈希值是标量。因此,您需要将%backup
转换为参考。
如果要将数据复制到新位置:
$globsessions{$session}{'backup'} = { %backup };
这是%backup
内容的浅表副本 - 效率较低,但可以防止在原始变量中覆盖键或值。警告:它不复制深层结构,因此如果%backup
中的值是另一个散列或数组引用,则可以修改它。如果要进行深层复制,请使用可存储的dclone
。
如果要将引用维护回原始哈希:
$globsessions{$session}{'backup'} = \%backup;
这会存储对%backup
的引用 - 效率更高,但如果您设置$globsessions{$session}{'backup'}{'foo'} = 'bar'
,那么您还会更改原始%backup
将数据复制回%backup :
浅拷贝可能就足够了:
%backup = %{ $globsessions{$session}{'backup'} };
或者使用深度副本,这种数据速度较慢但更安全,需要Storable
:
%backup = %{ dclone( $globsessions{$session}{'backup'} ) };
答案 1 :(得分:2)
我建议您使用Clone
模块复制哈希哈希值。
您需要取消引用存储的数据以将其移回哈希值,但使用存储的引用会更有效。
喜欢这个
use strict;
use warnings;
use Clone 'clone';
$globsessions{$session}{backup} = clone(\%backup);
然后使用
检索它my $backup = $globsessions{$session}{backup}
或者效率较低,您可以使用
复制顶级哈希元素my %backup = %{ $globsessions{$session}{backup} }
或者,如果您需要另一个完整的单独副本,您可以修改而不影响%globsessions
中的备份
my %backup = %{ clone($globsessions{$session}{backup}) }
注意这些代码片段未经测试,因为我目前无法访问Perl编译器。