[Rio-pm] Chaves de hash

thiagoglauco em ticursos.net thiagoglauco em ticursos.net
Quinta Novembro 29 13:52:45 PST 2012


Só para ser chato:

> popular um hash inteiro já com os grupos montados,

popular
adj. 2 g.
1. Relativo ou pertencente ao povo.
2. Que é usado ou comum entre o povo.
3. Que é do agrado do povo.
4. Vulgar, notório.
5. Democrático.
s. m.
6. Homem do povo.

povoar - Conjugar
(povo + -oar)
v. tr.
1. Fundar povoações em.
2. Estabelecer habitantes em.
3. Disseminar animais para reprodução.
4. Dispor grande quantidade de árvores em.
5. Dispor grande quantidade de plantas (ex.: povoar o terreno de 
vinha).

>>>6. [Por extensão]  Encher com determinada coisa (ex.: a notícia 
>>> povoou a sua vida com alegria).

v. pron.
7. Encher-se de habitantes.


Em 2012-11-29 19:41, Renato Santos escreveu:
> 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_1000 em 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: 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 [1]
>>> >
>>> > 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 [2]
>> > >
>>> > 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 [3]
>> > >>
>>> >>
>>> >>
>>> >>
>>> >>
>>> >>
>>> >> 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 [4]
>> > >> >>>
>>> >> >>>
>>> >> >>> _______________________________________________
>>> >> >>> Rio-pm mailing list
>>> >> >>> Rio-pm em pm.org
>> > >> >>> http://mail.pm.org/mailman/listinfo/rio-pm [4]
>>> >> >> _______________________________________________
>> > >> >> Rio-pm mailing list
>> > >> >> Rio-pm em pm.org
>>> >> >> http://mail.pm.org/mailman/listinfo/rio-pm [4]
>> > >> >
>>> >> > _______________________________________________
>>> >> > Rio-pm mailing list
>>> >> > Rio-pm em pm.org
>> > >> > http://mail.pm.org/mailman/listinfo/rio-pm [4]
>>> >>
>>> >> _______________________________________________
>> > >> Rio-pm mailing list
>> > >> Rio-pm em pm.org
>>> >> http://mail.pm.org/mailman/listinfo/rio-pm [4]
>>> >
>> > > _______________________________________________
>>> > Rio-pm mailing list
>>> > Rio-pm em pm.org
>>> > http://mail.pm.org/mailman/listinfo/rio-pm [4]
>> >
>>> _______________________________________________
>>> Rio-pm mailing list
>>> Rio-pm em pm.org
>>> http://mail.pm.org/mailman/listinfo/rio-pm [4]
>>
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm [4]
>
> --
>
> Saravá,
> Renato CRON
>
> http://www.renatocron.com/blog/ [5]
> @renato_cron [6]
>
>
> Links:
> ------
> [1] http://pastebin.com/9v6WFUT7
> [2] http://pastebin.com/Dnhv0Zya
> [3] http://ta.twi.tudelft.nl/users/vuik/wi211/disasters.html
> [4] http://mail.pm.org/mailman/listinfo/rio-pm
> [5] http://www.renatocron.com/blog/
> [6] http://twitter.com/#!/renato_cron
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm



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