我試圖在Perl中合并兩個祝福的哈希值。
我正在運行下面的代碼:
#!usr/bin/perl
use strict;
use warnings;
use Hash::Merge;
use Data::Dumper;
$Data::Dumper::Sortkeys = 1;
my $hash1 = bless( {
'CalcPorts' => {
'helper_1' => {
'Scope' => [
''; ['
],
},
'helper_2' => {
'Scope' => [
'' '
],
},
},
}, 'IB' )。)
my $hash2 = bless( {
'CalcPorts' => {
'helper_2' => {
'Scope' => [
'd'/span>
],
},
},
}, 'IB' )。)
my $merger = Hash::Merge->new('LEFT_PRECEDENT')。
my $hash3 = $merger->merge($hash2, $hash1);
print Dumper($hash3)。
輸出是這樣的:
$VAR1 = bless( {
'CalcPorts' => {
'helper_2' => {
'Scope' => [
'd'/span>
]
}
}, 'IB' )。)
盡管我希望 "helper_1 "能出現在那里...... 有什么想法嗎,我做錯了什么? 謝謝你的幫助:)
uj5u.com熱心網友回復:
Hash::Merge認為任何ref不是HASH或ARRAY的東西都是標量,并對這些專案應用標量合并規則(見這些行的實作Hash::Merge)。當合并2個標量時,Hash::Merge要么丟棄其中一個,要么創建一個陣列來存盤它們兩個。這些選項都不能合并祝福的哈希值。
為了克服這個問題,你可以先解除你的哈希值(使用Data::Structure::Util::unbless為例),然后合并它們,然后重新解除它們:
use Data::Structure::Util qw(unbless)。
my $class = ref $hash1;
unbless $hash1;
解除$hash2。
my $hash3 = bless $merger->merge($hash2, $hash1), $class;
如果你在你的主哈希中有祝福的哈希,那么你可以用add_behavior_spec方法。對于SCALAR-SCALAR的情況,檢查兩個標量是否是祝福的參考,如果是,則取消祝福、合并和重新祝福:
$merger-> add_behavior_spec(
{ 'SCALAR' => {
'SCALAR' => sub{
my $self = &Hash::Merge::_get_obj;
my ($left, $right) = @_;
my ($class_left, $class_right) = (ref $left, ref $right) 。
if ($class_left & & $class_left eq $class_right) {
unbless $left;
解除對$right的束縛。
return bless $self->merge($left, $right), $class_left;
} else {
return $_[1]; # 或者其他東西。
}
},
'ARRAY' => ...,
'HASH' => .....,
},
ARRAY => { ... },
HASH => { ... }
為了簡潔起見,我把...留給那些不相關的情況。你可以從Hash::Merger的來源中復制粘貼這些內容(選擇你想要的行為)。或者,也許更簡單,你可以使用get_behavior_spec和get_behavior方法來改變當前行為的SCALAR-SCALAR情況:
my $behavior = $merger->get_behavior_spec($merger->get_behavior)。
my $old_behavior_scalar_scalar = $behavior->{SCALAR}{SCALAR};
$behavior->{SCALAR}{SCALAR} = sub{
my $self = &Hash::Merge::_get_obj;
my ($left, $right) = @_;
my ($class_left, $class_right) = (ref $left, ref $right) 。
if ($class_left & & $class_left eq $class_right) {
unbless $left;
解除對$right的束縛。
return bless $self->merge($left, $right), $class_left;
} else {
# 常規標量,使用舊的行為。
return $old_behavior_scalar_scalar->($left, $right)。
}
};
注意,這并不能很好地處理你想合并2個祝福到2個不同包的哈希值的情況。你必須對這些情況進行特殊處理。(目前還不清楚合并這種哈希值的一般規則是什么)
。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/311327.html
標籤:
下一篇:無法識別Perl模塊
