[Rio-pm] Chaves de hash

Blabos de Blebe blabos em gmail.com
Quinta Novembro 29 17:02:31 PST 2012


Só pra ser muito chato:

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

http://wiki.mtgsalvation.com/article/Populate

Popular um hash é neologismo de 'populate a hash' que é equivalente a
povoar um hash...

2012/11/29  <thiagoglauco em ticursos.net>:
> 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
>
>
> _______________________________________________
> 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