【问题标题】:How to copy a nested hash如何复制嵌套哈希
【发布时间】:2014-09-08 09:54:57
【问题描述】:

如何将多级嵌套哈希(例如,%A)复制到另一个哈希(例如,%B)?我想确保新哈希不包含与原始哈希(%A)相同的引用(指针)。

如果我更改原始哈希 (%A) 中的任何内容,它不应该更改 新哈希(%B)中的任何内容。

我想要一种通用的方法。我知道我可以通过按值重新分配来做到这一点 对于每个级别的键(例如,%{ $b{kb} } = %a;)。

但是,应该有一个解决方案,无论密钥级别的数量如何(散列的散列 .... 散列的散列)

问题示例

use Data::Dumper; 
my %a=(q=>{ 
            q1=>1, 
            q2=>2, 
       }, 
        w=>2); 
my %b; 
my %c; 
%{ $b{kb} } = %a; 

print "\%b=[".Data::Dumper::Dumper (%b)."] "; 
%{ $c{kc} } = %a; # $b{kb} = \%a; 
print "\n\%c=[".Data::Dumper::Dumper (%c)."] "; 

# CHANGE THE VALUE OF KEY IN ORIGINAL HASH %a 
$a{q}{q1} = 2; # $c{kc} = \%a; 
print "\n\%b=[".Data::Dumper::Dumper (%b)."] "; 
print "\n\%c=[".Data::Dumper::Dumper (%c)."] ";

感谢您的帮助

【问题讨论】:

  • $b{kb} = { %a };%{ $b{kb} } = %a; 更具可读性。与$b{kb} = \%a; 相似,更容易对比。
  • @ikegami 是否使用大括号(例如,{ %a } 获取变量的引用(地址)?
  • @ikegami 感谢您提出改进建议。在另一个Stackoverflow question得到解释
  • { LIST } 是哈希构造函数。它创建一个匿名散列,将LIST 的结果分配给它,并返回对散列的引用。

标签: perl hash perl-data-structures perl-hash


【解决方案1】:

您想要的通常称为“深拷贝”,而赋值运算符则执行“浅拷贝”。

use Storable qw( dclone );

my $copy = dclone($src);

【讨论】:

    猜你喜欢
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多