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]