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_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 [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: 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 [3]
> >>
>>
>>
>>
>>
>>
>> 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 [4]
> >> >>>
>> >>>
>> >>> _______________________________________________
>> >>> Rio-pm mailing list
>> >>> Rio-pm@pm.org
> >> >>> http://mail.pm.org/mailman/listinfo/rio-pm [4]
>> >> _______________________________________________
> >> >> Rio-pm mailing list
> >> >> Rio-pm@pm.org
>> >> http://mail.pm.org/mailman/listinfo/rio-pm [4]
> >> >
>> > _______________________________________________
>> > Rio-pm mailing list
>> > Rio-pm@pm.org
> >> > http://mail.pm.org/mailman/listinfo/rio-pm [4]
>>
>> _______________________________________________
> >> Rio-pm mailing list
> >> Rio-pm@pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm [4]
>
> > _______________________________________________
> Rio-pm mailing list
> Rio-pm@pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm [4]
>
_______________________________________________
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm [4]

_______________________________________________
Rio-pm mailing list
Rio-pm@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@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

Responder a