0

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

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;

我一直在尝试从零%StoredParentshash处删除值。Tally(我有进一步的更新代码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零而不是留下的键{}

谢谢!

4

2 回答 2

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;
}
于 2012-04-30T18:14:14.597 回答
1

您所说的生成数据结构的代码有问题,因为它缺少两个右括号。

您必须使用平衡的{..}或转储显示您的实际代码,%StoredParentshash然后我们才能为您提供适当的帮助。

如果TallyParent2SecondParent散列中唯一的键,那么你应该写类似

for my $children (values %StoredParentshash) {
  @$children = grep $_->{Tally} != 0, @$children;
}
于 2012-04-30T18:18:44.407 回答