مشاكل مع الحذف في التجزئة بيرل
-
21-12-2019 - |
سؤال
يحتوي التجزئة الآخر على اسم كمفتاح (مقسم على _) ويحتوي على 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";
}
}
}
المحلول
التعليمات البرمجية الخاصة بك معقدة للغاية، ولكن أعتقد أن رمز المثال أدناه يفعل ما تحتاجه.يعمل عن طريق نسخ محتويات %anotherhash
(لو سمحت لا تستخدم مثل هذه الأسماء المروعة التي لا معنى لها لمتغيراتك). %temphash
عنصر واحد في كل مرة، وفقط إذا كانت القيمة الجديدة من %anotherhash
أطول من %temphash
my %temphash;
while (my ($key, $val) = each %anotherhash) {
my @key = split /_/, $key;
my $tempkey = join '_', @key[0,1,2];
my $tempval = $temphash{$tempkey};
unless (defined $tempval and length $tempval >= length $val) {
$temphash{$tempkey} = $val;
}
}
لا تنتمي إلى StackOverflow