Perl - 최소값 및 최대값 ​​[닫기]

Perl - 최소값 및 최대값 ​​[닫기]

입력 파일

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"

Perl 코드의 일부

 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} ]);
}

코드 $pos1=3512970000000,3717850000000 & $pos2=3514640000000,3719500000000. 내 코드는 $pos1이 10,000보다 작은 경우 최소값과 최대값을 찾기 위해 새 줄을 인쇄하지만 값이 10,0000보다 크면 pos1의 최소값을 인쇄하는 중에 오류가 발생합니다. $pos1의 최소값과 $pos2의 최대값을 찾기 위해 디버깅할 때 어떤 도움이라도 주시면 감사하겠습니다.

답변1

$group->{$label}->{pos1}항상 정의되어 있으면 6행으로 초기화합니다.

pos1 => 1e10,

이런 식으로 까지는 잘 작동합니다 $pos1 <= 1e10. $group->{$label}->{pos1} = 3512970000000입력 예에서와 같이 최소값을 인쇄하려면 초기화해야 합니다 $group->{$label}->{pos1} = -1(6행).

pos1 => -1,

그리고 13행을 다음과 같이 수정합니다.

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

답변2

13행의 코드를 변경하여: defend를 사용하세요.

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

관련 정보