如何保留嵌套Perl哈希的插入顺序并使用克隆?

时间:2010-08-29 08:52:03

标签: perl

我正在使用IxHash来记住哈希的插入顺序。但是当使用clone复制哈希时,我得到一个空哈希。

use strict;
use Switch;
use Data::Dumper;
use Clone qw(clone);
use Tie::Autotie 'Tie::IxHash';

our %h_basic_values;
my $t = tie our(%h_inner_hash), "Tie::IxHash";
my $t1 = tie our(%h_inner_hash1) , "Tie::IxHash";

%h_inner_hash = (
'in_1' => 'val_1',
'in_2' => 'val_2',
'in_3' => 'val_3'
);

%h_inner_hash1 = (
'innnn_1' => 'vallll_1',
'innnn_2' => 'vallll_2',
'innnn_3' => 'vallll_3',
);

$h_inner_hash{in_4}{inn_1} = "vall_1";
$h_inner_hash{in_4}{inn_2} = "vall_2";
$h_inner_hash{in_4}{inn_3} = "vall_3";
$h_inner_hash{in_4}{inn_4} = "vall_4";
$h_inner_hash{in_4}{inn_5}{innn_1} = 'valll_1';
$h_inner_hash{in_4}{inn_5}{innn_2} = "valll_2";
$h_inner_hash{in_4}{inn_5}{innn_3} = "valll_3";
$h_inner_hash{in_4}{inn_5}{innn_4} = "valll_4";

$h_inner_hash{in_4}{inn_5}{innn_5} = clone(\%h_inner_hash1);
print Dumper(\%h_inner_hash);

in $ h_inner_hash {in_4} {inn_5} {innn_5}我得到一个空哈希。

1 个答案:

答案 0 :(得分:4)

这不是Clone的问题,也不是%h_inner_hash1绑定的事实。这是一个limitation of Tie::Autotie。来自它的perldoc:

  

BUGS

     

[...]

     

分配参考

     

在Tie :: IxHash示例中,您不能   做:

$hash{jeff} = {
  age => 22,
  lang => 'Perl',
  brothers => 3,
  sisters => 4,
};
     

因为这会创建一个哈希引用,   不是Tie :: IxHash的对象。这个   哈希引用最终被销毁   无论如何,取而代之的是   Tie :: IxHash对象指向一个   空哈希。

作为一种手段,您可以手动复制%h_inner_hash1逐个键:

$h_inner_hash{in_4}{inn_5}{innn_5}{$_} = $h_inner_hash1{$_} for keys %h_inner_hash1;

或者您可以手动将每个哈希层绑定到Tie :: IxHash而不是使用Tie :: Autotie。