[Rio-pm] Chaves de hash

Aureliano Guedes guedes_1000 em hotmail.com
Quinta Novembro 29 12:46:08 PST 2012


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: thiagoglauco em ticursos.net
> To: rio-pm em 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: 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
> 
> _______________________________________________
> 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/8b2532e9/attachment-0001.html>


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