如何在哈希数组的散列中取消引用条目

时间:2017-07-25 13:21:16

标签: perl

我有一个像这样构建的数据结构: -

$ICVDWKey = "($LLX $LLY) ($URX $URY)";
...
push @{$ICVDWStats{$ICVDWKey}}, {
    ICVDensity=>$Density,
    ICVLayerArea=>$LayerArea,
    ICVWindowArea=>$WindowArea
};

我可以取消引用它的内容......

foreach $ICVDWKey (@AllICVDWCoords) {
    foreach (@{$ICVDWStats{$ICVDWKey}}) {
        $ICVDensity = $_->{ICVDensity};
        $ICVLayerArea = $_->{ICVLayerArea};
        $ICVWindowArea = $_->{ICVWindowArea};
        ...
     }
 }

......一切都很好。但是,当我以相同的方式构建另一个数据结构时遇到问题,我需要在循环上面的原始数据结构时检查其内容。这是一个例子......

foreach $ICVDWKey (@AllICVDWCoords) {
    foreach (@{$ICVDWStats{$ICVDWKey}}) {
        $ICVDensity = $_->{ICVDensity};
        $ICVLayerArea = $_->{ICVLayerArea};
        $ICVWindowArea = $_->{ICVWindowArea};
        ...
        if (exists ($ICC2DWStats{$ICVDWKey})) {
             $ICC2Density = $_->{ICC2Density};
             $ICC2LayerArea = $_->{ICC2LayerArea};
             $ICC2WindowArea = $_->{ICC2WindowArea};
             ...
        }
    }
}

我知道if exists $ICVDWKey匹配正常,但我无法干净地取消引用ICC2DWStats哈希数据的内容。当ICC2*个密钥在两个数据结构之间匹配时,检索$ICVDWKey数据的正确方法是什么?我确信它是$_引用中的ICC2*,但我不知道应该使用什么。

谢谢!

1 个答案:

答案 0 :(得分:2)

您需要显式指定要从中提取的实际hasn的哈希和键,而不是使用$_来表示您想要的$ICC2DWStats hashref之外的结构:

for $ICVDWKey (@AllICVDWCoords) {
    for (@{$ICVDWStats{$ICVDWKey}}) {
        $ICVDensity = $_->{ICVDensity};
        $ICVLayerArea = $_->{ICVLayerArea};
        $ICVWindowArea = $_->{ICVWindowArea};
        ...
        if (exists ($ICC2DWStats{$ICVDWKey})) {
             $ICC2Density = $ICC2DWStats->{$ICVDWKey}{ICC2Density};
             $ICC2LayerArea = $ICC2DWStats->{$ICVDWKey}{ICC2LayerArea};
             $ICC2WindowArea = $ICC2DWStats->{$ICVDWKey}{ICC2WindowArea};
             ...
        }
    }
}

请注意,您应该使用use strict;use warnings;