使用Perl将一个哈希插入另一个哈希

时间:2016-12-14 15:01:09

标签: perl hash

我尝试了许多使用推送和拼接的不同版本,但似乎无法根据需要组合两个哈希。试图将第二个哈希值插入'项目中的第一个哈希值。阵列:

(
  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 => " ",
    },
  },
)

有人可以建议我如何做到这一点吗?

1 个答案:

答案 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