[Rio-pm] Chaves de hash

Renato Santos renato.cron em gmail.com
Quinta Novembro 29 11:26:47 PST 2012


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_1000 em 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: thiagoglauco em ticursos.net
> > To: rio-pm em 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, thiagoglauco em 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, <thiagoglauco em 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 em pm.org
> > >>>> http://mail.pm.org/mailman/listinfo/rio-pm
> > >>>
> > >>>
> > >>> _______________________________________________
> > >>> Rio-pm mailing list
> > >>> Rio-pm em pm.org
> > >>> http://mail.pm.org/mailman/listinfo/rio-pm
> > >> _______________________________________________
> > >> Rio-pm mailing list
> > >> Rio-pm em pm.org
> > >> http://mail.pm.org/mailman/listinfo/rio-pm
> > >
> > > _______________________________________________
> > > Rio-pm mailing list
> > > Rio-pm em pm.org
> > > http://mail.pm.org/mailman/listinfo/rio-pm
> >
> > _______________________________________________
> > Rio-pm mailing list
> > Rio-pm em pm.org
> > http://mail.pm.org/mailman/listinfo/rio-pm
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20121129/edd994b9/attachment-0001.html>


Mais detalhes sobre a lista de discussão Rio-pm