我尝试使用以下代码从我创建的哈希数组的哈希值中删除值:
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
为零的密钥而不是{}
?
谢谢!
答案 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
来显示您的实际代码。
如果Tally
和Parent2
是SecondParent
哈希中的唯一键,那么您应该写一些类似
for my $children (values %StoredParentshash) {
@$children = grep $_->{Tally} != 0, @$children;
}