Perl-Minimal- und Maximalwert

Perl-Minimal- und Maximalwert

Eingabedatei

Xm_ABL1 Geneious    extracted region    1   168 .   +   .   Name=Extracted region from gi|371443098|gb|JH556762.1|;Extracted interval="3512970000000 -> 3514640000000"
Xm_ABL1 Geneious    extracted region    169 334 .   +   .   Name=Extracted region from gi|371443098|gb|JH556762.1|;Extracted interval="3717850000000 -> 3719500000000"

Teil des Perl-Codes

 if ($array[1] =~ /extracted region/){
            die "No CDS record for $key!\n" unless $metadata->{$key};
    (my $label = $array[7]) =~ s/.*region from (.*)\|;.*/$1/;
    $label =~ s/\|/_/g;
    $group->{$label} ||= { 
            pos1 => 1e10,
            pos2 => 0,
            metadata => $metadata->{$key},
            sequences => [],
    };
    (my $pos1, my $arr, my $pos2) = ($array[7]=~/.*interval=\"(\d+) (<?->?) (\d+)\"$/gm);
    # capture hi/lo values for group
    $group->{$label}->{pos1} = $pos1 if $pos1 < $group->{$label}->{pos1};
    $group->{$label}->{pos2} = $pos2 if $pos2 > $group->{$label}->{pos2};
    # push this sequence onto the group's array
    push(@{ $group->{$label}->{sequences} }, [ $pos1, $pos2, $arrow->{$arr} ]);
}

Im Code $pos1=3512970000000,3717850000000 & $pos2=3514640000000,3719500000000. Mein Code druckt eine neue Zeile, um den Mindest- und Höchstwert zu ermitteln (wenn $pos1 kleiner als 10.000 ist), aber wenn der Wert größer als 10.0000 ist, tritt beim Drucken des Mindestwerts von pos1 ein Fehler auf. Jede Hilfe beim Debuggen zum Ermitteln des Mindestwerts von $pos1 und des Höchstwerts von $pos2 ist willkommen.

Antwort1

$group->{$label}->{pos1}ist immer definiert, Sie haben es mit Zeile 6 initialisiert:

pos1 => 1e10,

so dass es bis funktioniert $pos1 <= 1e10. Wenn Sie den Mindestwert drucken möchten $group->{$label}->{pos1} = 3512970000000(wie Ihre Beispieleingabe), müssen Sie initialisieren $group->{$label}->{pos1} = -1(Zeile 6):

pos1 => -1,

und ändern Sie Zeile 13 mit:

$group->{$label}->{pos1} = $pos1 if (($group->{$label}->{pos1} < 0) || ($pos1 < $group->{$label}->{pos1}));

Antwort2

durch Ändern des Codes in Zeile 13: using defiend

 $group->{$label}->{pos1} = $pos1 if ((!defined $group->{$label}->{pos1})
 ||  ($pos1 < $group->{$label}->{pos1})); 

verwandte Informationen