[Rio-pm] Chaves de hash

Aureliano Guedes guedes_1000 em hotmail.com
Quinta Novembro 29 14:48:58 PST 2012


Pois é, se eu fosse fazer na unha eu faria

use Path::Class;

 
my $dir  = dir('Parse');

my $s = $dir->open or die "cant open: $!";

my @o = $s->read;

foreach my $p (@o){

    if (-f $p){

        print $p . "\n";

        sleep 1;

    }

    else {

        next;

    }

}

From: renato.cron em gmail.com
Date: Thu, 29 Nov 2012 20:21:48 -0200
To: rio-pm em pm.org
Subject: Re: [Rio-pm] Chaves de hash

http://perldoc.perl.org/functions/-X.html
procure por -d e por -e e por .... leia tudo!

2012/11/29 Aureliano Guedes <guedes_1000 em hotmail.com>






So aproveitando a oportunidade.

Estou brincando com brinquedinhos novos.
Mas ainda não entendi uma coisa.

Aqui eu quero escrever na tela so o que for documento, não quero o que for diretorio.
Na unha eu sei fazer, eu quero fazer isso usando o modulo Path::Class.



Abaixo não esta dando muito certo.
O que errei??

use Path::Class;

 
my $dir  = dir('Parse');

my $s = $dir->open or die "cant open: $!";

my @o = $s->read;

foreach my $p (@o){

    if ($p->file){

        print $p;

    }

}

> Date: Thu, 29 Nov 2012 19:52:45 -0200
> From: thiagoglauco em ticursos.net
> To: rio-pm em pm.org


> Subject: Re: [Rio-pm] Chaves de hash
> 
> 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


 		 	   		  

_______________________________________________

Rio-pm mailing list

Rio-pm em pm.org

http://mail.pm.org/mailman/listinfo/rio-pm


-- 
Saravá,

Renato CRONhttp://www.renatocron.com/blog/

@renato_cron



_______________________________________________
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/dfb3ada6/attachment-0001.html>


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