Как сохранить порядок вставки вложенного хэша Perl и использования клона? - PullRequest
4 голосов
/ 29 августа 2010

Я использую 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} я получаю пустой хеш.

1 Ответ

4 голосов
/ 29 августа 2010

Это не проблема с клоном или с тем фактом, что %h_inner_hash1 связан.Это ограничение Tie::Autotie.Из его perldoc:

BUGS

[...]

Назначение ссылки

В примере Tie :: IxHash вы не можетеdo:

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

, потому что это создает ссылку на хеш, а не объект Tie :: IxHash.Эта хеш-ссылка в конечном итоге уничтожается и заменяется объектом Tie :: IxHash, который указывает на пустой хеш.

В качестве средства для его округления вы можете вручную скопировать %h_inner_hash1 key-by-key:

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

или вы можете вручную связать каждый слой хеша с Tie :: IxHash вместо использования Tie :: Autotie.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...