我尝试了许多使用推送和拼接的不同版本,但似乎无法根据需要组合两个哈希。试图将第二个哈希值插入'项目中的第一个哈希值。阵列:
(
ItemData => { Item => { ItemNum => 2, PriceList => "25.00", UOM => " " } },
)
(
Alternate => {
Description => "OIL FILTER",
InFile => "Y",
MfgCode => "FRA",
QtyAvailable => 29,
Stocked => "Y",
},
)
我需要插入第二个' Alternate'哈希进入'项目'此结果的第一个哈希数组:
(
ItemData => {
Item => {
Alternate => {
Description => "OIL FILTER",
InFile => "Y",
MfgCode => "FRA",
QtyAvailable => 29,
Stocked => "Y",
},
ItemNum => 2,
PriceList => "25.00",
UOM => " ",
},
},
)
有人可以建议我如何做到这一点吗?
答案 0 :(得分:3)
假设您有两个哈希引用,这很简单。
my $item = {
'ItemData' => {
'Item' => {
'PriceList' => '25.00',
'UOM' => ' ',
'ItemNum' => '2'
}
}
};
my $alt = {
'Alternate' => {
'MfgCode' => 'FRA',
'Description' => 'OIL FILTER',
'Stocked' => 'Y',
'InFile' => 'Y',
'QtyAvailable' => '29'
}
};
$item->{ItemData}->{Item}->{Alternate} = $alt->{Alternate};
这里的诀窍不是将$alt
实际合并到$item
的某个部分,而是只取你想要的特定部分并将其放在你想要的位置。我们从Alternate
获取$alt
密钥,并将其内容放入Alternate
内容中的新$item
密钥中。
Adam Millerchip在删除的评论中指出,这不是副本。如果您将$alt->{Alternative}
中的任何键更改为$item
之后,那么数据也会在$item
内更改,因为我们正在处理引用。
$item->{ItemData}->{Item}->{Alternate} = $alt->{Alternate};
$alt->{Alternate}->{InFile} = 'foobar';
这实际上也会将$item->{ItemData}->{Item}->{Alternate}->{InFile}
的值更改为 foobar ,如下所示。
$VAR1 = {
'ItemData' => {
'Item' => {
'ItemNum' => '2',
'Alternate' => {
'Stocked' => 'Y',
'MfgCode' => 'FRA',
'InFile' => 'foobar',
'Description' => 'OIL FILTER',
'QtyAvailable' => '29'
},
'UOM' => ' ',
'PriceList' => '25.00'
}
}
};
引用应该这样做,因为它们只引用某些东西。这对他们有什么好处。
要制作真正的副本,您需要取消引用并创建新的匿名哈希引用。
# create a new ref
# deref
$item->{ItemData}->{Item}->{Alternate} = { %{ $alt->{Alternate} } };
这将创建一个浅表副本。直接在Alternate
键内的值将是副本,但如果它们包含引用,则不会复制这些值,而是引用它们。
如果您确实需要合并较大的数据结构,而需要合并一个以上的内容,请查看Hash::Merge。