Usa uma função pra normalizar o valor (multiplica por 10, divide o inteiro por 10) ou alguma coisa que retorne o "grupo" que cada valor se encontra, aí vc faz apenas um loop e um calculo por valor e aí vc faz assim $ref; For (..) { $grupo = funcao($_->{valor}); push @{$ref->{$grupo}}, $_; }
O ref vai virar um hash com os valores e dentro todos que fazem parte dele. Em 29/11/2012 16:59, "Aureliano Guedes" <guedes_1...@hotmail.com> escreveu: > Nossa, aqui virou uma arena de ideias, da para aprender muita coisa so > lendo. > > O problema é o seguinte, eu tenho uma lista nesse formato: > > target: 01010101 > length: 581 > miRNA : hsa-miR-15a > length: 22 > > mfe: -24.4 kcal/mol > p-value: 0.334111 > > position 244 > target 5' C UCUCCUGUGGUCUCU G U 3' > CACA GACCA GUGCUGUU > GUGU UUGGU CACGACGA > miRNA 3' AAUA U 5' > > > Conforme este arquivo http://pastebin.com/9v6WFUT7 > > Eu quero filtrar essa lista de acordo com o valor de mfe. > > Exemplo, se mfe for menor que -30 e maior que -20 esta dentro. > > Logo fiz da seguinte forma: http://pastebin.com/Dnhv0Zya > > Funcionou, o problema era sono. Não percebi que a regex estava pegando um > espaço. > > Quanto a usar reais como chave de hash, se eu tiver dois reais iguais > poderá ser um problema para acessar os valores, > mas em toda regra existe sua exceção. > > No meu caso, o que me importa é que mfe esteja no intervalo determinado. > > Caso descordem seria uma honra ler a explicação de qualquer um de vocês. > > > Date: Thu, 29 Nov 2012 16:44:50 -0200 > > From: thiagogla...@ticursos.net > > To: rio-pm@pm.org > > Subject: Re: [Rio-pm] Chaves de hash > > > > Um exemplo mais preciso: > > > > $ uname -a > > SunOS cg01spo 5.10 Generic_138888-03 sun4v sparc > > SUNW,SPARC-Enterprise-T5120 > > > > $ perl -E ' > > if (0.2 > 0.19999999999999997){ > > say "0.2 is greater than 0.19999999999999997";} > > else { > > say "Floating Point is not true real"};' > > 0.2 is greater than 0.19999999999999997 > > $ > > > > $ perl -E ' > > if (0.2 > 0.19999999999999998){ > > say "0.2 is greater than 0.19999999999999998";} > > else { > > say "Floating Point is not true real"};' > > Floating Point is not true real > > $ > > > > Por que é importante saber essas coisas? > > http://ta.twi.tudelft.nl/users/vuik/wi211/disasters.html > > > > > > > > > > > > > > Em 2012-11-29 15:13, thiagogla...@ticursos.net escreveu: > > >> Não se compara reais por igualdade. > > > Se você tem erro na igualdade, terá nas outras comparações se a > > > diferença entre os números for menor que o maior acréscimo suportado > > > pela plataforma: > > > > > > $ perl -E ' > > > if (0.2 > 0.19999999999999999999999999999999999999999999){ > > >> say "0.2 is greater than 0.19999999999999999999999999999999999999";} > > >> else { > > >> say "Floating Point is not true real"};' > > > Floating Point is not true real > > > $ > > > > > > $ perl -E ' > > > if (0.2 > 0.199999){ > > > say "0.2 is greater than 0.199999";} > > > else { > > > say "Floating Point is not true real"};' > > > 0.2 is greater than 0.199999 > > > $ > > > > > > Então, comparar pontos flutuantes não é seguro. Nem igualdade, nem > > > maio, nem menor. > > > > > > E mais: garanto que se você quer usar um número real como chave de > > > Hash você tem um problema na análise da lógica do problema que está > > > enfrentando e como solucioná-lo. > > > > > > > > > Em 2012-11-29 10:36, Blabos de Blebe escreveu: > > >> Na verdade é o contrário, não? > > >> > > >> Não se compara reais por igualdade. > > >> > > >> Se você usa reais como chaves de hash, você tem algum problema... > > >> > > >> Ao não controlar a representação interna em ponto flutuante, você > > >> pode > > >> nunca mais alcançar o valor relacionado à chave, se usar um número > > >> real como chave, pois qualquer bit diferente, mesmo que arredondando > > >> no mesmo número vai resultar num cálculo diferente na tabela hash. > > >> > > >> Igualdade entre númros reais constuma ser definida como algo assim: > > >> > > >> sub float_equal { > > >> my ($first, $second) = @_; > > >> my $threshold = 0.00000001 # arbitrário > > >> return abs( $first - $second ) < $threshold; > > >> } > > >> > > >> Converter para string antes de usar como chave de hash também não me > > >> parece saudável, pois, embora a string vá funcionar bem no hash, > > >> você > > >> não garante que a conversão vai resultar sempre na mesma string, e > > >> aí > > >> vc se ferra do mesmo jeito. > > >> > > >> Por outro lado, se você nunca vai acessar o elemento do hash através > > >> da chave, um foreach por keys() ou values() vai te retornar os > > >> valores... > > >> > > >> Mas aí eu te perguntaria por que rails você está usando hash pra > > >> isso... > > >> > > >> > > >> > > >> On Thu, Nov 29, 2012 at 6:47 AM, <thiagogla...@ticursos.net> wrote: > > >>> Existe um problema aqui, diferente da comparação. > > >>> A comparação de reais é problemática devido a estrutura interna do > > >>> ponto > > >>> flutuante. NÃO SE COMPARA REAIS POR MAIOR OU MENOR.Isso não é do > > >>> Perl, mas > > >>> das regras de aproximação usada pelos processadores. > > >>> > > >>> Rounding rules > > >>> > > >>> The standard defines five rounding rules. The first two round to a > > >>> nearest > > >>> value; the others are called directed roundings: > > >>> Roundings to nearest > > >>> > > >>> Round to nearest, ties to even – rounds to the nearest value; > > >>> if the > > >>> number falls midway it is rounded to the nearest value with an even > > >>> (zero) > > >>> least significant bit, which occurs 50% of the time; this is the > > >>> default for > > >>> binary floating-point and the recommended default for decimal. > > >>> Round to nearest, ties away from zero – rounds to the nearest > > >>> value; if > > >>> the number falls midway it is rounded to the nearest value above > > >>> (for > > >>> positive numbers) or below (for negative numbers); this is intended > > >>> as an > > >>> option for decimal floating point. > > >>> > > >>> Directed roundings > > >>> > > >>> Round toward 0 – directed rounding towards zero (also known as > > >>> truncation). > > >>> Round toward +∞ – directed rounding towards positive infinity > > >>> (also > > >>> known as rounding up or ceiling). > > >>> Round toward −∞ – directed rounding towards negative infinity > > >>> (also > > >>> known as rounding down or floor). > > >>> > > >>> Se a comparação for inevitável, converta o seu número para string e > > >>> compare > > >>> ou determine um nível de precisão aceitável e faça bit a bit. > > >>> > > >>> Em 2012-11-28 21:42, Aureliano Guedes escreveu: > > >>>> > > >>>> Ola Monges. > > >>>> > > >>>> Estou com um problema simples mas que não acho a solução. > > >>>> > > >>>> Eu tenho um hash onde as chaves são valores numericos reais (a > > >>>> maioria negativo e quase nenhum inteiro). > > >>>> Estou limitando esses valores por um maximo e um minimo. > > >>>> > > >>>> foreach my $keys (keys %d) { > > >>>> if ($keys <= $min and $keys >= $max) { > > >>>> print "$d{$keys}"; > > >>>> } > > >>>> } > > >>>> > > >>>> Problema que não da certo. > > >>>> Ha algo de errado aqui?? > > >>>> > > >>>> _______________________________________________ > > >>>> Rio-pm mailing list > > >>>> Rio-pm@pm.org > > >>>> http://mail.pm.org/mailman/listinfo/rio-pm > > >>> > > >>> > > >>> _______________________________________________ > > >>> Rio-pm mailing list > > >>> Rio-pm@pm.org > > >>> http://mail.pm.org/mailman/listinfo/rio-pm > > >> _______________________________________________ > > >> Rio-pm mailing list > > >> Rio-pm@pm.org > > >> http://mail.pm.org/mailman/listinfo/rio-pm > > > > > > _______________________________________________ > > > Rio-pm mailing list > > > Rio-pm@pm.org > > > http://mail.pm.org/mailman/listinfo/rio-pm > > > > _______________________________________________ > > Rio-pm mailing list > > Rio-pm@pm.org > > http://mail.pm.org/mailman/listinfo/rio-pm > > _______________________________________________ > Rio-pm mailing list > Rio-pm@pm.org > http://mail.pm.org/mailman/listinfo/rio-pm >
_______________________________________________ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm