Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用克隆保留嵌套Perl哈希的插入顺序?_Perl - Fatal编程技术网

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

如何使用克隆保留嵌套Perl哈希的插入顺序?,perl,Perl,我使用IxHash来记住哈希的插入顺序。但是当使用克隆来复制散列时,我得到了一个空散列 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::I

我使用IxHash来记住哈希的插入顺序。但是当使用克隆来复制散列时,我得到了一个空散列

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);

在$h_inner_hash{in_4}{inn_5}{innn_5}中,我得到了一个空的hash。

克隆或
%h_inner_hash1
绑定这不是问题。这是一个好主意。从其perldoc:

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);
漏洞 [……]

指定引用 在Tie::IxHash示例中,您不能 做:

因为这会创建一个散列引用, 不是Tie::IxHash的对象。这 散列引用最终被销毁 总之,用一个 Tie::指向 空散列

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);
作为一种手段,您可以手动逐键复制
%h\u inner\u hash1

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

或者,您可以手动将散列的每一层绑定到tie::IxHash,而不是使用tie::Autotie。

只是为了澄清,POD中引用的部分位于BUGS标题下。