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

データ構造を生成したと言うコードには、2 つの右中括弧がないため、欠陥があります。

{バランスのとれた..を使用した実際のコードを表示するか、適切なサポートを提供する前に..}のダンプを表示する必要があります。%StoredParentshash

TallyParent2がハッシュの唯一のキーである場合、次のSecondParentように書く必要があります

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