Assim, não sei se tem muita diferença na memoria entre um $h e um %s, eu costumo usar $h por habito mesmo, mas poderia ser push @{$h{$grupo}} sem problemas, talvez até @$h{$grupo} funcione certo
O 'evitar o loop' q eu digo, é você popular um hash inteiro já com os grupos montados, por exemplo ,se o grupo for a cada 10 numeros reais, voce poderia retornar "-30:-20" como chave para todos os valores de entrada dessa funcao, e popular tudo de uma vez só, no lugar de ler as chaves a cada pergunta de intervalo 2012/11/29 Aureliano Guedes <guedes_1...@hotmail.com> > 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 > -- Saravá, Renato CRON http://www.renatocron.com/blog/ @renato_cron <http://twitter.com/#!/renato_cron>
_______________________________________________ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm