Perl - valor mínimo e máximo [fechado]

0

arquivo de entrada

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"

parte do código 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} ]);
}

No código $ pos1 = 3512970000000,3717850000000 & $ pos2 = 3514640000000,3719500000000. Meu código imprime nova linha, encontrando valores mínimo e máximo (se $ pos1 for menor que 10.000), mas se o valor for maior que 10.0000, haverá erro na impressão do valor mínimo de pos1. Qualquer ajuda é apreciada na depuração para encontrar valor mínimo de $ pos1 e valor máximo de $ pos2

    
por jack 19.07.2012 / 21:09

2 respostas

1

$group->{$label}->{pos1} é sempre definido, você é inizializado com a linha 6:

pos1 => 1e10,

para que funcione até $pos1 <= 1e10 . Se você quiser imprimir o valor mínimo $group->{$label}->{pos1} = 3512970000000 (como sua entrada de amostra), você deve inizializar $group->{$label}->{pos1} = -1 (linha 6):

pos1 => -1,

e modifique a linha 13 com:

$group->{$label}->{pos1} = $pos1 if (($group->{$label}->{pos1} < 0) || ($pos1 < $group->{$label}->{pos1}));
    
por 21.07.2012 / 16:39
0

alterando o código na linha 13: usando defiend

 $group->{$label}->{pos1} = $pos1 if ((!defined $group->{$label}->{pos1})
 ||  ($pos1 < $group->{$label}->{pos1})); 
    
por 20.07.2012 / 20:48

Tags