如何拼接数组哈希中的数组?

时间:2019-06-06 19:23:09

标签: perl

我正在像这样填充数据结构:-

push @{$AvailTrackLocsTop{$VLayerName}}, $CurrentTrackLoc;

其中$ VLayerName是类似m1,m2,m3等的字符串,而$ CurrentTrackLoc只是一个十进制数字。如果我在完全填充哈希之后使用Data :: Dumper打印哈希的内容,它将显示我期望的结果,例如:-

$VAR1 = {
      'm11' => [
                 '0.228',
                 '0.316',
                 '0.402',
                 '0.576',
                 '0.750',
                 '569.458',
                 '569.544',
                 '569.718',
                 '569.892'
               ]
    };

现在,我需要有效地拼接存储的十进制数字列表。我可以这样删除条目:-

for (my $i = $c; $i <= $endc; $i++) {
    delete $AvailTrackLocsTop{$VLayerName}->[$i];
}

结果与预期的一样,是一堆“ undef”条目,这些条目曾经存在数字,例如:-

$VAR1 = {
      'm11' => [
                 undef,
                 undef,
                 undef,
                 undef,
                 '0.750',
                 '569.458',
                 '569.544',
                 '569.718',
                 '569.892'
               ]
    };

但是如何清除undef条目,以使我看到类似这样的内容?

$VAR1 = {
      'm11' => [
                 '0.750',
                 '569.458',
                 '569.544',
                 '569.718',
                 '569.892'
               ]
    };

请务必注意,删除操作可以在阵列中的任何位置进行,例如例如索引33和100的99。很容易在哈希结构的上下文之外拼接数组,但是当将数组嵌入大型哈希中时,我却在努力操作数组。

2 个答案:

答案 0 :(得分:5)

首先,我想从delete文档中进行说明:

WARNING: Calling delete on array values is strongly discouraged. The notion of deleting or checking the existence of Perl array elements is not conceptually coherent, and can lead to surprising behavior.

将数组元素设置为undef的正确方法是使用undef函数(或仅向其分配undef)。

要删除元素,可以使用splice函数,该函数在嵌套arrayrefs上的作用方式与在普通数组上相同,只需要像对push一样取消引用它即可。

splice @{$AvailTrackLocsTop{$VLayerName}}, $c, $endc - $c + 1;

答案 1 :(得分:1)

可能最简单的方法是在没有undef的情况下重建数组:

$_ = [ grep defined, @$_ ] for values %AvailTrackLocsTop;

或者,您可以使用哈希的哈希代替数组的哈希,然后删除将导致它们消失而不必简单地转向undef。如果这很重要,您将失去订单。