Другой хеш содержит имя как ключ (разделенный на _) и состоит из 4 частей (я сравниваю первые три части). Значение представляет собой строку, длину которой мне нужно сравнить, и если имя такое же и уже существует в хэше (первые три части), мне нужно сохранить строку с самой длинной длиной, и если длины равны, я не заботиться о том, что он держит. Я знаю, что с итерацией возникают проблемы, поскольку пары ключ-значение удаляются.
my %temphash=();
%temphash=%anotherhash;
foreach my $tempkey(keys %temphash){
my @tempkey_splitted = split /\_/, $tempkey;
my $tempkey_newfamily = $tempkey_splitted[0];
my $tempkey_newgenera = $tempkey_splitted[1];
my $tempkey_newspecies = $tempkey_splitted[2];
my $tempkey_catstring ="$tempkey_newfamily"."_$tempkey_newgenera"."_$tempkey_newspecies";
my $sequence_realkey="";
my $sequence_tempkey="";
my $length_realkey="";
my $length_tempkey="";
if ($realkey_catstring eq $tempkey_catstring){
$sequence_realkey = $anotherhash{$realkey};
$length_realkey = length($sequence_realkey);
#print "$anotherhash{$realkey}";
#print "$length_realkey";
$sequence_tempkey = $temphash{$tempkey};
#print "$anotherhash{$tempkey}";
$length_tempkey = length($sequence_tempkey);
# print "$length_tempkey";
if($length_realkey>$length_tempkey){
delete($temphash{$tempkey});
#print ">$realkey\n$anotherhash{$realkey}\n\n";
}
elsif($length_tempkey>$length_realkey){
delete($temphash{$realkey});
#print ">$tempkey\n$anotherhash{$tempkey}\n\n";
}
elsif($length_tempkey eq $length_realkey){
delete($temphash{$realkey});
}
}
else{
print "do nothing";
}
}
}
each
, он позволяет безопасно удалять записи во время итерации. - person Hunter McMillen   schedule 29.07.2014each
, позаботьтесь о том, чтобы цикл выполнялся до конца, иначе вы обнаружите, что в следующий раз, когда вы войдете в цикл, вы получите только оставшуюся часть хэша, который вы не повторяли в последний раз. - person Leeft   schedule 29.07.2014