将散列哈希值(HoH)复制到键/值对中并返回perl

时间:2013-11-30 16:03:14

标签: perl hash

我想知道这是否可行以及如何:我有一个散列哈希%backup并且我想将它保存在哈希的另一个哈希值中,如下所示:

$globsessions{$session}{'backup'} = %backup;

以及稍后(当然)我希望它回复:

%backup = $globsessions{$session}{'backup'};

这不起作用,我在这里丢了一点(可能少喝咖啡......)。 %globsessions在我的应用中是全局的,应该重复使用。

非常感谢您的帮助!

编辑: 使用Neil建议的引用不起作用,因为下次我需要数据时拥有%backup的孩子已经死了,因此引用不再有效。所以我有一个孩子/父母问题,而不是'复制一个hashofhashes'问题。但Neil的解决方案是正确的!

2 个答案:

答案 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编译器。