从哈希数组的Perl哈希中删除值

时间:2012-04-30 17:54:50

标签: perl perl-data-structures

我尝试使用以下代码从我创建的哈希数组的哈希值中删除值:

while ((my $Genotype1, my $Fitness1) = each (%Normalisedfithash)) {
  while ((my $Parent1A, my $TallyP1) = each(%P1Tallyhash)) {
    my $ParentTally = 0;
    my $SecondParent = {
      Parent2 => $Parent1A,
      Tally => $ParentTally,
    };
    push @{ $StoredParentshash{$Genotype1}}, $SecondParent;

我一直在尝试删除%StoredParentshashTally为零的值。 (我还有更新Tally的代码,但有些代码没有更新,我希望它们从哈希中删除。

我写了以下内容:

for my $Parent (keys %StoredParentshash) {
  my $aref1 = $StoredParentshash{$Parent};
  for my $hashref1 (@$aref1) {
    my $Tally =  $hashref1->{'Tally'};
    if ($Tally == 0){
      delete $hashref1->{'Tally'};
      delete $hashref1->{'Parent2'};
    }
  }
}

此代码类删除数据,但当我使用Data::Dumper时,我得到的结构如下所示:

 '7412' => [
        {},
        {
          'Tally' => 1,
          'Parent2' => '2136'
        },
        {},
        {},
        {},

如何完全删除Tally为零的密钥而不是{}

谢谢!

2 个答案:

答案 0 :(得分:1)

您的数据如下:

my %StoredParentshash = (
   key1 => [
      {
         Tally => ...,
         ...
      },
      ...
   ],
   ...
);

您想要删除一些数组元素。通常,我会使用grep

@array = grep keep_condition(), @array;

这也不例外。

for my $array (values(%StoredParentshash)) {
   @$array = grep $_->{Tally}, @$array;
}

并删除任何现在为空的数组:

for my $key (keys(%StoredParentshash)) {
   delete $StoredParentshash{$key} if !@{ $StoredParentshash{$key} };
}

或合并:

for my $key (keys(%StoredParentshash)) {
   my $array = $StoredParentshash{$key};
   @$array = grep $_->{Tally}, @$array;
   delete $StoredParentshash{$key} if !@$array;
}

答案 1 :(得分:1)

你说的代码生成数据结构是错误的,因为它缺少两个结束括号。

在我们能够正确帮助您之前,您必须使用平衡{ .. }或转储%StoredParentshash来显示您的实际代码。

如果TallyParent2SecondParent哈希中的唯一键,那么您应该写一些类似

的内容
for my $children (values %StoredParentshash) {
  @$children = grep $_->{Tally} != 0, @$children;
}