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

Jim*_*ing 3 perl hash

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

$globsessions{$session}{'backup'} = %backup;
Run Code Online (Sandbox Code Playgroud)

后来(当然)我希望它像这样:

%backup = $globsessions{$session}{'backup'};
Run Code Online (Sandbox Code Playgroud)

这不起作用,我只是在这里失去了一点(可能少喝咖啡......).该%globsessions是我的应用程序的全球和应该被重复使用.

非常感谢您的帮助!

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

Nei*_*ter 7

您接近正确的语法,但不能将散列直接指定为另一个散列中的值.哈希值是标量.所以你需要把你%backup变成一个参考.


如果要将数据复制到新位置:

$globsessions{$session}{'backup'} = { %backup };
Run Code Online (Sandbox Code Playgroud)

这是内容的浅层副本%backup- 效率较低,但可以防止在原始变量中覆盖过多的键或值.警告:它不复制深层结构,因此如果值%backup是另一个散列或数组引用,则可以修改它.dclone如果要进行深层复制,请使用可存储的.


如果要将引用维护回原始哈希:

$globsessions{$session}{'backup'} = \%backup;
Run Code Online (Sandbox Code Playgroud)

这会存储一个引用%backup- 它更有效,但如果你设置,$globsessions{$session}{'backup'}{'foo'} = 'bar'那么你也可以更改原始%backup


要将数据复制回%backup:

浅拷贝可能就足够了:

%backup = %{ $globsessions{$session}{'backup'} };
Run Code Online (Sandbox Code Playgroud)

或者使用深度副本,这种数据较慢但更安全,并且需要Storable:

%backup = %{ dclone( $globsessions{$session}{'backup'} ) };
Run Code Online (Sandbox Code Playgroud)