重複の可能性:
Perl でデータ構造のディープ コピーを作成する最良の方法は?
これを自分でコーディングして車輪の再発明を始める前に、ハッシュ参照を複製せずにハッシュのハッシュをコピーするにはどうすればよいでしょうか?
Config::Generalを介してハッシュのハッシュのハッシュを読んでいます。つまり、データ構造は次のとおりです。
my %config = ( group => { item1 => { foo => 'value',
bar => 'value',
},
item2 => { foo => 'value',
bar => 'value',
},
item3 => { foo => 'value',
bar => 'value',
},
},
);
次に、構成ファイルを書き換える前に、グループを逆参照して構成からプルし、実行時に内容を変更します。
my %group = %{$config{'group'}};
問題は、変更が行われたかどうかを確認し、システムのファイル構造に関連する変更を加える必要があることです。私はチェックすることによってこれを行うことはできません:
if ($group{'item1'}{'foo'} ne $config{'group'}{'item1'}{'foo'}) {
### Stuff!
}
as$group{'item1'}
と$config{'group'}{'item1'}
はどちらもまったく同じ hashref です。
構成ファイルを単純に再解析し、ディスクに保存する直前にディスクから解析されたコピーを編集済みのバージョンと比較するのは簡単ですが、複雑なデータ構造のネストされた逆参照への方法があると確信しています、単に参照自体をコピーするのではなく、ハッシュ参照の内容をコピーします。CPAN をざっと調べただけでは何もわかりません。私は何が欠けていますか?
基準
私の答えを得ました:
#!/usr/bin/perl
use Benchmark qw(:all) ;
use Storable qw(dclone);
use Clone qw(clone);
my %config = ( group => { item1 => { foo => 'value',
bar => 'value',
},
item2 => { foo => 'value',
bar => 'value',
},
item3 => { foo => 'value',
bar => 'value',
},
},
);
my $ref = $config{'group'};
timethese(100000, {
'Clone' => sub { my %group = %{ clone $ref }},
'Storable' => sub { my %group = %{ dclone $ref }},
});
結果:
ベンチマーク: クローンの 100000 回の反復のタイミング、保存可能な... クローン: 2 ウォールクロック秒 (2.26 usr + 0.01 sys = 2.27 CPU) @ 44052.86/s (n=100000) 保存可能: 5 ウォールクロック秒 (4.71 usr + 0.02 sys = 4.73 CPU) @ 21141.65/s (n=100000)