从散列数组的Perl散列中删除值

从散列数组的Perl散列中删除值,perl,perl-data-structures,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 =

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

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
为零。(我有更多的代码更新了
计数
,但有些代码没有更新,我希望它们从散列中删除)

我写了以下内容:

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'
        },
        {},
        {},
        {},
如果
计数
为零,我如何才能完全删除键,而不是保留
{}

谢谢

您的数据看起来像:

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;
}

您所说的生成数据结构的代码是错误的,因为它缺少两个右大括号

您必须使用平衡的
{
.
}
或转储的
%StoredParentshash
显示实际代码,然后我们才能正确帮助您

如果
Tally
Parent2
SecondParent
散列中唯一的键,那么您应该编写如下代码

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

如果您也提供了输入数据,那么会更容易。更好的方法是对该问题进行可运行的演示。很抱歉,输入数据最初来自Mysql数据库,然后以不同的方式更改为%Normalisedfithash和%P1Tallyhash-我认为解释它的来源会让人困惑,但我现在明白了,我应该提供更多的信息,你是对的,我们不需要知道它来自哪里。我只是指一个输入的图示,就像您为当前输出提供的那样。这将使
@$array
只包含带有
Tally
元素的假值的散列。这在很大程度上与OP的代码相反,OP的代码试图删除带有零
计数
元素的所有元素。@Borodin,修复。(就像我告诉OP的那样,如果他提供了一个可运行的问题演示会更好。那么测试我的解决方案就很简单了。)这会让一些阵列完全空着,例如“7412”=>[]-我如何删除这些?@Lisa,再做一次扫描,删除具有空数组引用值的外部哈希的键。答案中添加了密码。它们是唯一的钥匙-谢谢。(错误中,我没有复制最后两个大括号)