Renato, fiquei sem entender, no meu caso não esta fazendo so um loop? E qual a diferença entre usar um hash %h ou tranformar $h em um hash?? Desculpe as perguntas é que não faço nenhum curso ligado a computação logo as vezes fico "boiando".
Thiago, segue o script caso tenha também algo a modificar/acrescentar a nível das minhas péssimas práticas. use warnings; use strict; use Path::Class; #Guardar os valores em um hash acessado pelo valor do mfe sub h_energy{ my $data = shift; my $file = file($data)->openr(); my %hmfe = (); my $mirna; my $record; while (my $linha = <$file>) { if ( $linha =~ m{target:.*} ) { $record = $linha . $record if ($record); $hmfe{$mirna} = $record if ($mirna); $mirna = $+{mirna}; $record = q() if ($record); } elsif ($linha =~ m{mfe:\s+(\S+)\s+kcal/mol}){ $mirna = $1; $record .= $linha; } else { $record .= $linha; } } return %hmfe; } sub termofilter{ my ($data, $min, $max) = @_; my %d = h_energy($data); foreach my $keys (keys %d){ if($keys >= $min and $keys <= $max){ print $keys . "\n"; } } } termofilter("hybrid.txt", "-30", "-20"); > Date: Thu, 29 Nov 2012 17:27:15 -0200 > From: thiagogla...@ticursos.net > To: rio-pm@pm.org > Subject: Re: [Rio-pm] Chaves de hash > > Onde estou agora o firewall bloqueia o pastebin. Pela sua explicação, > verificar por regex seria uma solução segura. O número sera convertido > para um string e, se a sua regex prevê uma margem segura para a > imprecisão do ponto flutuante na sua aplicação, funciona sem problemas. > > Em 2012-11-29 16:59, Aureliano Guedes 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
_______________________________________________ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm