从散列数组的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,再做一次扫描,删除具有空数组引用值的外部哈希的键。答案中添加了密码。它们是唯一的钥匙-谢谢。(错误中,我没有复制最后两个大括号)