سؤال

يحتوي التجزئة الآخر على اسم كمفتاح (مقسم على _) ويحتوي على 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;
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top