Re: [Rio-pm] Chaves de hash
Desculpa, Não entendi a diferença entre: perl -E 'sub a{say 1} sub b{say 2} if (a() b()){}' perl -E 'sub a{say 1} sub b{say 2} if (a() and b()){}' perl -E 'sub a{say 1;return 0} sub b{say 2} if (a() b()){}' perl -E 'sub a{say 1;return 0} sub b{say 2} if (a() and b()){}' Até onde eu sei, não existe operador de short circuit. O short circuit é uma propriedade, uma otimização na avaliação de expressões lógicas. Alguém estamos viajando? []'s 2012/11/30 thiagogla...@ticursos.net: Eu devo ser muito estúpido... mas alguém que está falando isso (ja é o 3o), poderia fazer o favor de me explicar porque ele deve usar no lugar do 'and' e qual diferença isso faz no caso deste if específico? E em quais situações deve-se usar o 'and' no lugar de ? Não é estúpido não. Vamos analisar a tabela da verdade da função and ou : 0 x 0 = 0 0 x 1 = 0 1 x 0 = 0 1 x 1 = 1 Então, no if do código do nosso biólogo não haveria impacto real, sorry eu me deixei levar por outras coisas que estava pensando aqui. Mas voltando ao if: if($keys = $min and $keys = $max) O operador de short circuit só avaliaria a expresssão da direita ($keys = $max) se a primeira expressão for verdadeira. Ou seja, se $keys for menor que $min o Perl nem vai perder tempo checando pois 0 x N = 0. Então aqui eu me enganei, não ia fazer diferença no código do nosso colega. Por outro lado, vamos supor um caso que você queira aproveitar o teste if e executar duas subs na mesma linha de código: if ( foo and bar ){ ...faça alguma coisa } else { ... bar só será executada se foo retornar true } por outro lado: if ( foo bar ){ ...foo e bar foram executadas. faça alguma coisa } else { ... foo e bar foram executadas mesmo com o retornando false. } essa é a diferença. Em 2012-11-29 22:09, Bruno Buss escreveu: 2012/11/29 thiagogla...@ticursos.net Seu primeiro erro é o operador and. No documento perlop: $ perldoc perlop você vai descobrir o seguinte: Logical And Binary and returns the logical conjunction of the two surrounding expressions. It's equivalent to except for the very low precedence. This means that it short-circuits: i.e., the right expression is evaluated only if the left expression is true. [...] C-style Logical And Binary performs a short-circuit logical AND operation. That is, if the left operand is false, the right operand is not even evaluated. Scalar or list context propagates down to the right operand if it is evaluated. Logo, seu código if($keys = $min and $keys = $max){ deveria ser if($keys = $min $keys = $max){ Eu devo ser muito estúpido... mas alguém que está falando isso (ja é o 3o), poderia fazer o favor de me explicar porque ele deve usar no lugar do 'and' e qual diferença isso faz no caso deste if específico? E em quais situações deve-se usar o 'and' no lugar de ? [ ]'s-- Bruno C. Buss http://www.brunobuss.net [1] Links: -- [1] http://www.brunobuss.net ___ 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 ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
Hi. A diferença entre ** e *and* não é apenas a questão da precedência dos operadores? Penso eu que essa questão não tenha nada a ver com *short-circuiting*, já que logicamente falando ambas fazem a mesma operação. Exemplificando, quando temos: use Data::Printer; my $a = 1; my $b = 0; my $c = $a $b; my $d = $a and $b; p $c; p $d; O valor de $c seria FALSE, mas o valor de $d seria TRUE. Isso, porque, pela precedência dos operadores, a última operação é a mesma coisa que: (my $d = $a) and $b; Deste modo, $d sempre resultará em TRUE, ignorando o $b. Isto é, pelo menos é assim em outras linguagens e pelo que me parece, no Perl também. []'s Em 4 de dezembro de 2012 14:00, Blabos de Blebe bla...@gmail.com escreveu: Desculpa, Não entendi a diferença entre: perl -E 'sub a{say 1} sub b{say 2} if (a() b()){}' perl -E 'sub a{say 1} sub b{say 2} if (a() and b()){}' perl -E 'sub a{say 1;return 0} sub b{say 2} if (a() b()){}' perl -E 'sub a{say 1;return 0} sub b{say 2} if (a() and b()){}' Até onde eu sei, não existe operador de short circuit. O short circuit é uma propriedade, uma otimização na avaliação de expressões lógicas. Alguém estamos viajando? []'s 2012/11/30 thiagogla...@ticursos.net: Eu devo ser muito estúpido... mas alguém que está falando isso (ja é o 3o), poderia fazer o favor de me explicar porque ele deve usar no lugar do 'and' e qual diferença isso faz no caso deste if específico? E em quais situações deve-se usar o 'and' no lugar de ? Não é estúpido não. Vamos analisar a tabela da verdade da função and ou : 0 x 0 = 0 0 x 1 = 0 1 x 0 = 0 1 x 1 = 1 Então, no if do código do nosso biólogo não haveria impacto real, sorry eu me deixei levar por outras coisas que estava pensando aqui. Mas voltando ao if: if($keys = $min and $keys = $max) O operador de short circuit só avaliaria a expresssão da direita ($keys = $max) se a primeira expressão for verdadeira. Ou seja, se $keys for menor que $min o Perl nem vai perder tempo checando pois 0 x N = 0. Então aqui eu me enganei, não ia fazer diferença no código do nosso colega. Por outro lado, vamos supor um caso que você queira aproveitar o teste if e executar duas subs na mesma linha de código: if ( foo and bar ){ ...faça alguma coisa } else { ... bar só será executada se foo retornar true } por outro lado: if ( foo bar ){ ...foo e bar foram executadas. faça alguma coisa } else { ... foo e bar foram executadas mesmo com o retornando false. } essa é a diferença. Em 2012-11-29 22:09, Bruno Buss escreveu: 2012/11/29 thiagogla...@ticursos.net Seu primeiro erro é o operador and. No documento perlop: $ perldoc perlop você vai descobrir o seguinte: Logical And Binary and returns the logical conjunction of the two surrounding expressions. It's equivalent to except for the very low precedence. This means that it short-circuits: i.e., the right expression is evaluated only if the left expression is true. [...] C-style Logical And Binary performs a short-circuit logical AND operation. That is, if the left operand is false, the right operand is not even evaluated. Scalar or list context propagates down to the right operand if it is evaluated. Logo, seu código if($keys = $min and $keys = $max){ deveria ser if($keys = $min $keys = $max){ Eu devo ser muito estúpido... mas alguém que está falando isso (ja é o 3o), poderia fazer o favor de me explicar porque ele deve usar no lugar do 'and' e qual diferença isso faz no caso deste if específico? E em quais situações deve-se usar o 'and' no lugar de ? [ ]'s-- Bruno C. Buss http://www.brunobuss.net [1] Links: -- [1] http://www.brunobuss.net ___ 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 ___ 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
Re: [Rio-pm] Chaves de hash
brinque com os valores https://gist.github.com/4205775 1,0 0,1 6,666 666,6 etc 2012/12/4 Aureliano Guedes guedes_1...@hotmail.com Alguem passa um exemplo onde esteja evidente a diferença entre e and! Um caso onde em um de certo e em outro não! From: bla...@gmail.com Date: Tue, 4 Dec 2012 14:00:45 -0200 To: rio-pm@pm.org Subject: Re: [Rio-pm] Chaves de hash Desculpa, Não entendi a diferença entre: perl -E 'sub a{say 1} sub b{say 2} if (a() b()){}' perl -E 'sub a{say 1} sub b{say 2} if (a() and b()){}' perl -E 'sub a{say 1;return 0} sub b{say 2} if (a() b()){}' perl -E 'sub a{say 1;return 0} sub b{say 2} if (a() and b()){}' Até onde eu sei, não existe operador de short circuit. O short circuit é uma propriedade, uma otimização na avaliação de expressões lógicas. Alguém estamos viajando? []'s 2012/11/30 thiagogla...@ticursos.net: Eu devo ser muito estúpido... mas alguém que está falando isso (ja é o 3o), poderia fazer o favor de me explicar porque ele deve usar no lugar do 'and' e qual diferença isso faz no caso deste if específico? E em quais situações deve-se usar o 'and' no lugar de ? Não é estúpido não. Vamos analisar a tabela da verdade da função and ou : 0 x 0 = 0 0 x 1 = 0 1 x 0 = 0 1 x 1 = 1 Então, no if do código do nosso biólogo não haveria impacto real, sorry eu me deixei levar por outras coisas que estava pensando aqui. Mas voltando ao if: if($keys = $min and $keys = $max) O operador de short circuit só avaliaria a expresssão da direita ($keys = $max) se a primeira expressão for verdadeira. Ou seja, se $keys for menor que $min o Perl nem vai perder tempo checando pois 0 x N = 0. Então aqui eu me enganei, não ia fazer diferença no código do nosso colega. Por outro lado, vamos supor um caso que você queira aproveitar o teste if e executar duas subs na mesma linha de código: if ( foo and bar ){ ...faça alguma coisa } else { ... bar só será executada se foo retornar true } por outro lado: if ( foo bar ){ ...foo e bar foram executadas. faça alguma coisa } else { ... foo e bar foram executadas mesmo com o retornando false. } essa é a diferença. Em 2012-11-29 22:09, Bruno Buss escreveu: 2012/11/29 thiagogla...@ticursos.net Seu primeiro erro é o operador and. No documento perlop: $ perldoc perlop você vai descobrir o seguinte: Logical And Binary and returns the logical conjunction of the two surrounding expressions. It's equivalent to except for the very low precedence. This means that it short-circuits: i.e., the right expression is evaluated only if the left expression is true. [...] C-style Logical And Binary performs a short-circuit logical AND operation. That is, if the left operand is false, the right operand is not even evaluated. Scalar or list context propagates down to the right operand if it is evaluated. Logo, seu código if($keys = $min and $keys = $max){ deveria ser if($keys = $min $keys = $max){ Eu devo ser muito estúpido... mas alguém que está falando isso (ja é o 3o), poderia fazer o favor de me explicar porque ele deve usar no lugar do 'and' e qual diferença isso faz no caso deste if específico? E em quais situações deve-se usar o 'and' no lugar de ? [ ]'s-- Bruno C. Buss http://www.brunobuss.net [1] Links: -- [1] http://www.brunobuss.net ___ 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 ___ 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 -- Tiago B. Peczenyj Linux User #405772 http://pacman.blog.br ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
2012/11/30 Aureliano Guedes guedes_1...@hotmail.com: Quanto ao and e o , o consome menos memória que o and, por ser short circuits?? Não. A única diferença é a precedência. Ambos fazem short circuit. pirl @ sub { $x and $y } sub { package Shell::Perl::sandbox; use warnings; use strict 'refs'; $y if $x; } pirl @ sub { $x $y } sub { package Shell::Perl::sandbox; use warnings; use strict 'refs'; $y if $x; } ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
2012/12/4 Aureliano Guedes guedes_1...@hotmail.com: Alguem passa um exemplo onde esteja evidente a diferença entre e and! Um caso onde em um de certo e em outro não! Não acredite em tudo que você ouve, mesmo na lista da Rio-pm. Dizer que usar and em if ($keys = $min and $keys = $max) { é um erro, é um exagero dos grandes, quase purismo. Em geral, só uso o and quando estou fazendo uma conjunção de statements (do mesmo tipo que o or) como nos exemplos clássicos my $product = current_product() and return $product-description; open my $f, '', 'file.txt' or die Bad kitty: $@; my $var = frobnicate() or return; # exit the current function if result of frobnicate() is false E o eu deixo só para conjunção de expressões. Por exemplo, eu usaria if ($keys = $min $keys = $max) { porque isto parece natural para mim. No entanto, isto é puramente uma questão de estilo, e programadores têm estilos diferentes. Na base de código em que trabalho, você encontra os dois tipos de expressão com e and (ou a dicotomia similar entre || e or). Eu não diria para o Graham Barr que ele usou and / or errado (ainda que eu preferisse / || em alguns lugares). =) Happy coding! ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
2012/12/4 Blabos de Blebe bla...@gmail.com: Até onde eu sei, não existe operador de short circuit. O short circuit é uma propriedade, uma otimização na avaliação de expressões lógicas. Sim, existem operadores de short circuit que são aqueles que podem ou não completar a avaliação (evaluation) do segundo argumento baseado no primeiro. Este é o caso dos operadores lógicos and or xor err || ^ // Assim em $a = 0; ++$a || ++$a; $a # $a termina como 1 o segundo ++$a nunca vai ser executado, mas em $a = -1; ++$a || ++$a; $a o primeiro ++$a deixa 0 em $a e o segundo ++$a deixa 1. Você não pode representar estes operadores como funções f( operando1, operando2 ) onde todos os operandos são calculados antes da invocação de f - que é o mesmo de caso de se representar os comandos condicionais if e unless. Aposto que vocês lembraram das aulas de linguagem funcionais, applicative vs normal order evaluation, etc. ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
last; Em 4 de dezembro de 2012 14:54, Blabos de Blebe bla...@gmail.com escreveu: (my $d = $a) and $b; Correto, conforme http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity A pegadinha (deixada como exercício) é que o operador de atribuição tem maior precedência que o operador 'and'. Por isso os exemplos usando atribuição estão se cagando todos: $c = $a $b é diferente de $c = $a and $b não por causa da diferença mística entre '' e 'and', mas por causa do operador de atribuição ter mais precedência que 'and' e menos precedência que o ''; $c = $a $b == $c = ( $a $b ) $c = $a and $b == ($c = $a) and $b RTFM! []'s 2012/12/4 Junior Moraes juniiior...@gmail.com: Hi. A diferença entre e and não é apenas a questão da precedência dos operadores? Penso eu que essa questão não tenha nada a ver com short-circuiting, já que logicamente falando ambas fazem a mesma operação. Exemplificando, quando temos: use Data::Printer; my $a = 1; my $b = 0; my $c = $a $b; my $d = $a and $b; p $c; p $d; O valor de $c seria FALSE, mas o valor de $d seria TRUE. Isso, porque, pela precedência dos operadores, a última operação é a mesma coisa que: (my $d = $a) and $b; Deste modo, $d sempre resultará em TRUE, ignorando o $b. Isto é, pelo menos é assim em outras linguagens e pelo que me parece, no Perl também. []'s Em 4 de dezembro de 2012 14:00, Blabos de Blebe bla...@gmail.com escreveu: Desculpa, Não entendi a diferença entre: perl -E 'sub a{say 1} sub b{say 2} if (a() b()){}' perl -E 'sub a{say 1} sub b{say 2} if (a() and b()){}' perl -E 'sub a{say 1;return 0} sub b{say 2} if (a() b()){}' perl -E 'sub a{say 1;return 0} sub b{say 2} if (a() and b()){}' Até onde eu sei, não existe operador de short circuit. O short circuit é uma propriedade, uma otimização na avaliação de expressões lógicas. Alguém estamos viajando? []'s 2012/11/30 thiagogla...@ticursos.net: Eu devo ser muito estúpido... mas alguém que está falando isso (ja é o 3o), poderia fazer o favor de me explicar porque ele deve usar no lugar do 'and' e qual diferença isso faz no caso deste if específico? E em quais situações deve-se usar o 'and' no lugar de ? Não é estúpido não. Vamos analisar a tabela da verdade da função and ou : 0 x 0 = 0 0 x 1 = 0 1 x 0 = 0 1 x 1 = 1 Então, no if do código do nosso biólogo não haveria impacto real, sorry eu me deixei levar por outras coisas que estava pensando aqui. Mas voltando ao if: if($keys = $min and $keys = $max) O operador de short circuit só avaliaria a expresssão da direita ($keys = $max) se a primeira expressão for verdadeira. Ou seja, se $keys for menor que $min o Perl nem vai perder tempo checando pois 0 x N = 0. Então aqui eu me enganei, não ia fazer diferença no código do nosso colega. Por outro lado, vamos supor um caso que você queira aproveitar o teste if e executar duas subs na mesma linha de código: if ( foo and bar ){ ...faça alguma coisa } else { ... bar só será executada se foo retornar true } por outro lado: if ( foo bar ){ ...foo e bar foram executadas. faça alguma coisa } else { ... foo e bar foram executadas mesmo com o retornando false. } essa é a diferença. Em 2012-11-29 22:09, Bruno Buss escreveu: 2012/11/29 thiagogla...@ticursos.net Seu primeiro erro é o operador and. No documento perlop: $ perldoc perlop você vai descobrir o seguinte: Logical And Binary and returns the logical conjunction of the two surrounding expressions. It's equivalent to except for the very low precedence. This means that it short-circuits: i.e., the right expression is evaluated only if the left expression is true. [...] C-style Logical And Binary performs a short-circuit logical AND operation. That is, if the left operand is false, the right operand is not even evaluated. Scalar or list context propagates down to the right operand if it is evaluated. Logo, seu código if($keys = $min and $keys = $max){ deveria ser if($keys = $min $keys = $max){ Eu devo ser muito estúpido... mas alguém que está falando isso (ja é o 3o), poderia fazer o favor de me explicar porque ele deve usar no lugar do 'and' e qual diferença isso faz no caso deste if específico? E em quais situações deve-se usar o 'and' no lugar de ? [ ]'s-- Bruno C. Buss http://www.brunobuss.net [1] Links: -- [1] http://www.brunobuss.net ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm ___ Rio-pm mailing list Rio-pm@pm.org
Re: [Rio-pm] Chaves de hash
Ok, segundo o perldoc: Binary and returns the logical conjunction of the two surrounding expressions. It's equivalent to except for the very low precedence. This means that it short-circuits: the right expression is evaluated only if the left expression is true. Acho que não é nada impactante a diferença de usar ou and em dias normais, mas quando trabalhar bit-a-bit acho que o é mais apropiado Date: Tue, 4 Dec 2012 15:23:04 -0200 From: viniciusmias...@gmail.com To: rio-pm@pm.org Subject: Re: [Rio-pm] Chaves de hash last; Em 4 de dezembro de 2012 14:54, Blabos de Blebe bla...@gmail.com escreveu: (my $d = $a) and $b; Correto, conforme http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity A pegadinha (deixada como exercício) é que o operador de atribuição tem maior precedência que o operador 'and'. Por isso os exemplos usando atribuição estão se cagando todos: $c = $a $b é diferente de $c = $a and $b não por causa da diferença mística entre '' e 'and', mas por causa do operador de atribuição ter mais precedência que 'and' e menos precedência que o ''; $c = $a $b == $c = ( $a $b ) $c = $a and $b == ($c = $a) and $b RTFM! []'s 2012/12/4 Junior Moraes juniiior...@gmail.com: Hi. A diferença entre e and não é apenas a questão da precedência dos operadores? Penso eu que essa questão não tenha nada a ver com short-circuiting, já que logicamente falando ambas fazem a mesma operação. Exemplificando, quando temos: use Data::Printer; my $a = 1; my $b = 0; my $c = $a $b; my $d = $a and $b; p $c; p $d; O valor de $c seria FALSE, mas o valor de $d seria TRUE. Isso, porque, pela precedência dos operadores, a última operação é a mesma coisa que: (my $d = $a) and $b; Deste modo, $d sempre resultará em TRUE, ignorando o $b. Isto é, pelo menos é assim em outras linguagens e pelo que me parece, no Perl também. []'s Em 4 de dezembro de 2012 14:00, Blabos de Blebe bla...@gmail.com escreveu: Desculpa, Não entendi a diferença entre: perl -E 'sub a{say 1} sub b{say 2} if (a() b()){}' perl -E 'sub a{say 1} sub b{say 2} if (a() and b()){}' perl -E 'sub a{say 1;return 0} sub b{say 2} if (a() b()){}' perl -E 'sub a{say 1;return 0} sub b{say 2} if (a() and b()){}' Até onde eu sei, não existe operador de short circuit. O short circuit é uma propriedade, uma otimização na avaliação de expressões lógicas. Alguém estamos viajando? []'s 2012/11/30 thiagogla...@ticursos.net: Eu devo ser muito estúpido... mas alguém que está falando isso (ja é o 3o), poderia fazer o favor de me explicar porque ele deve usar no lugar do 'and' e qual diferença isso faz no caso deste if específico? E em quais situações deve-se usar o 'and' no lugar de ? Não é estúpido não. Vamos analisar a tabela da verdade da função and ou : 0 x 0 = 0 0 x 1 = 0 1 x 0 = 0 1 x 1 = 1 Então, no if do código do nosso biólogo não haveria impacto real, sorry eu me deixei levar por outras coisas que estava pensando aqui. Mas voltando ao if: if($keys = $min and $keys = $max) O operador de short circuit só avaliaria a expresssão da direita ($keys = $max) se a primeira expressão for verdadeira. Ou seja, se $keys for menor que $min o Perl nem vai perder tempo checando pois 0 x N = 0. Então aqui eu me enganei, não ia fazer diferença no código do nosso colega. Por outro lado, vamos supor um caso que você queira aproveitar o teste if e executar duas subs na mesma linha de código: if ( foo and bar ){ ...faça alguma coisa } else { ... bar só será executada se foo retornar true } por outro lado: if ( foo bar ){ ...foo e bar foram executadas. faça alguma coisa } else { ... foo e bar foram executadas mesmo com o retornando false. } essa é a diferença. Em 2012-11-29 22:09, Bruno Buss escreveu: 2012/11/29 thiagogla...@ticursos.net Seu primeiro erro é o operador and. No documento perlop: $ perldoc perlop você vai descobrir o seguinte: Logical And Binary and returns the logical conjunction of the two surrounding expressions. It's equivalent to except for the very low precedence. This means that it short-circuits: i.e., the right expression is evaluated only if the left expression is true. [...] C-style Logical And Binary performs a short-circuit logical AND operation. That is, if the left operand is false, the right operand is not even evaluated. Scalar or list context propagates down to the right operand if it is evaluated. Logo, seu código if($keys = $min and $keys = $max){ deveria ser if($keys = $min $keys = $max){ Eu devo ser muito estúpido... mas alguém que está falando isso (ja é o 3o), poderia fazer o favor de
Re: [Rio-pm] Chaves de hash
Gente, não tem diferença na comparação!! é só na ordem que as coisas ocorrem conforme as coisas foram escritas!! alguem ai ja disse: $c = $a $b *COMPILA PRA *$c = ( $a $b ) $c = $a and $b *COMPILA PRA* ($c = $a) and $b 2012/12/4 Aureliano Guedes guedes_1...@hotmail.com Acho que não é nada impactante a diferença de usar ou and em dias normais, mas quando trabalhar bit-a-bit acho que o é mais apropiado -- Saravá, Renato CRON http://www.renatocron.com/blog/ @renato_cron http://twitter.com/#!/renato_cron ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
2012/12/4 Aureliano Guedes guedes_1...@hotmail.com: mas quando trabalhar bit-a-bit acho que o é mais apropiado Para trabalhar bit-a-bit, os operadores bit-a-bit como o provavelmente seriam mais adequados. Bitwise And http://perldoc.perl.org/perlop.html#Bitwise-And Bitwise Or and Exclusive Or http://perldoc.perl.org/perlop.html#Bitwise-Or-and-Exclusive-Or ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
O exemplo do junio é bacana: use Data::Printer; my $a = 1; my $b = 0; my $c = $a $b; my $d = $a and $b; p $c; p $d; Date: Tue, 4 Dec 2012 15:50:13 -0200 From: a.r.ferre...@gmail.com To: rio-pm@pm.org Subject: Re: [Rio-pm] Chaves de hash 2012/12/4 Aureliano Guedes guedes_1...@hotmail.com: mas quando trabalhar bit-a-bit acho que o é mais apropiado Para trabalhar bit-a-bit, os operadores bit-a-bit como o provavelmente seriam mais adequados. Bitwise And http://perldoc.perl.org/perlop.html#Bitwise-And Bitwise Or and Exclusive Or http://perldoc.perl.org/perlop.html#Bitwise-Or-and-Exclusive-Or ___ 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
Re: [Rio-pm] Chaves de hash
Porra o q? To mostrando q eh diferente no contexto q eu conheco... Em 29/11/2012 23:14, Blabos de Blebe bla...@gmail.com escreveu: Porra PAC, não pisa fora da faixa, cara! :) http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity É só aplicar as regras de precedência. Parafraseando o perldoc, and é 'equivalent to except for the very low precedence' É óbvio gente. Assim vcs me envergonham! Game over. 2012/11/29 Tiago Peczenyj tiago.pecze...@gmail.com: veja este exemplo: https://gist.github.com/4172935 veja como a execução das subrotinas não é alterada, mas o resultado das variaveis é diferente. my $x = a and b and c and ok or nok; my $y = a b c ok || nok; veja que x recebe o valor que a retorna, enquanto y recebe o valor de nok. isso pq o = esta em termos de precedencia entre o and e o 2012/11/29 Bruno Buss bruno.b...@gmail.com 2012/11/29 Bruno Buss bruno.b...@gmail.com On Thu, Nov 29, 2012 at 10:13 PM, Renato Santos renato.c...@gmail.com wrote: use sempre e seja feliz, só use and quando você souber oque está fazendo. Desculpe mas vou discordar que um bom conselho seja use sempre e seja feliz, ainda mais seguido de só use and quando você souber oque está fazendo. Na melhor da hipóteses são sugestões contraditórias... como alguém deverá saber quando usar o 'and' se apenas usa o cegamente? o 'and' é praticamente o 'e' da nossa lingua, vc diz pro seu codigo 'faça isso, e isso', ele não é de comparação, embora faça ele não é de comparação, embora faça? Poderia desenvolver melhor, pois não fui incapaz de entender o que isso significa para um operador lógico (que a única diferença do outro é a baixa precedência). s/incapaz/capaz/; E vou repetir a pergunta aqui, antes que ela fique soterrada pelas tricks de sleep: Qual diferença isso faz no caso deste if específico do Aureliano? Por que exatamente, no if dele, utilizar o 'and' está incorreto? Porque no if dele, somente o dá certo como 3 pessoas já disseram? -- Bruno C. Buss http://www.brunobuss.net -- Bruno C. Buss http://www.brunobuss.net ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm -- Tiago B. Peczenyj Linux User #405772 http://pacman.blog.br ___ 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 ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
Sua ideia é louvável, mas há um problema. No Arquivo que eu postei, eu compilei de a rotina de um modulo dentro do script. Isso se deve ao fato de eu ter desenvolvido um modulo que parseia todo o documento naquele formato e cria um hash colocando como chave o valor que eu procuro, que pode ser o nome do micro-RNA, a energia de ligação, a posição no gene, ... Criei esse modulo (que futuramente pretendo adicionar no CPAN ou BioPerl) para facilitar minha vida. Por isso eu já não filtro o intervalo na própria regex. Quanto ao and e o , o consome menos memória que o and, por ser short circuits?? Date: Fri, 30 Nov 2012 06:22:03 -0200 From: tiago.pecze...@gmail.com To: rio-pm@pm.org Subject: Re: [Rio-pm] Chaves de hash Porra o q? To mostrando q eh diferente no contexto q eu conheco... Em 29/11/2012 23:14, Blabos de Blebe bla...@gmail.com escreveu: Porra PAC, não pisa fora da faixa, cara! :) http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity É só aplicar as regras de precedência. Parafraseando o perldoc, and é 'equivalent to except for the very low precedence' É óbvio gente. Assim vcs me envergonham! Game over. 2012/11/29 Tiago Peczenyj tiago.pecze...@gmail.com: veja este exemplo: https://gist.github.com/4172935 veja como a execução das subrotinas não é alterada, mas o resultado das variaveis é diferente. my $x = a and b and c and ok or nok; my $y = a b c ok || nok; veja que x recebe o valor que a retorna, enquanto y recebe o valor de nok. isso pq o = esta em termos de precedencia entre o and e o 2012/11/29 Bruno Buss bruno.b...@gmail.com 2012/11/29 Bruno Buss bruno.b...@gmail.com On Thu, Nov 29, 2012 at 10:13 PM, Renato Santos renato.c...@gmail.com wrote: use sempre e seja feliz, só use and quando você souber oque está fazendo. Desculpe mas vou discordar que um bom conselho seja use sempre e seja feliz, ainda mais seguido de só use and quando você souber oque está fazendo. Na melhor da hipóteses são sugestões contraditórias... como alguém deverá saber quando usar o 'and' se apenas usa o cegamente? o 'and' é praticamente o 'e' da nossa lingua, vc diz pro seu codigo 'faça isso, e isso', ele não é de comparação, embora faça ele não é de comparação, embora faça? Poderia desenvolver melhor, pois não fui incapaz de entender o que isso significa para um operador lógico (que a única diferença do outro é a baixa precedência). s/incapaz/capaz/; E vou repetir a pergunta aqui, antes que ela fique soterrada pelas tricks de sleep: Qual diferença isso faz no caso deste if específico do Aureliano? Por que exatamente, no if dele, utilizar o 'and' está incorreto? Porque no if dele, somente o dá certo como 3 pessoas já disseram? -- Bruno C. Buss http://www.brunobuss.net -- Bruno C. Buss http://www.brunobuss.net ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm -- Tiago B. Peczenyj Linux User #405772 http://pacman.blog.br ___ 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 ___ 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
Re: [Rio-pm] Chaves de hash
Eu devo ser muito estúpido... mas alguém que está falando isso (ja é o 3o), poderia fazer o favor de me explicar porque ele deve usar no lugar do 'and' e qual diferença isso faz no caso deste if específico? E em quais situações deve-se usar o 'and' no lugar de ? Não é estúpido não. Vamos analisar a tabela da verdade da função and ou : 0 x 0 = 0 0 x 1 = 0 1 x 0 = 0 1 x 1 = 1 Então, no if do código do nosso biólogo não haveria impacto real, sorry eu me deixei levar por outras coisas que estava pensando aqui. Mas voltando ao if: if($keys = $min and $keys = $max) O operador de short circuit só avaliaria a expresssão da direita ($keys = $max) se a primeira expressão for verdadeira. Ou seja, se $keys for menor que $min o Perl nem vai perder tempo checando pois 0 x N = 0. Então aqui eu me enganei, não ia fazer diferença no código do nosso colega. Por outro lado, vamos supor um caso que você queira aproveitar o teste if e executar duas subs na mesma linha de código: if ( foo and bar ){ ...faça alguma coisa } else { ... bar só será executada se foo retornar true } por outro lado: if ( foo bar ){ ...foo e bar foram executadas. faça alguma coisa } else { ... foo e bar foram executadas mesmo com o retornando false. } essa é a diferença. Em 2012-11-29 22:09, Bruno Buss escreveu: 2012/11/29 thiagogla...@ticursos.net Seu primeiro erro é o operador and. No documento perlop: $ perldoc perlop você vai descobrir o seguinte: Logical And Binary and returns the logical conjunction of the two surrounding expressions. It's equivalent to except for the very low precedence. This means that it short-circuits: i.e., the right expression is evaluated only if the left expression is true. [...] C-style Logical And Binary performs a short-circuit logical AND operation. That is, if the left operand is false, the right operand is not even evaluated. Scalar or list context propagates down to the right operand if it is evaluated. Logo, seu código if($keys = $min and $keys = $max){ deveria ser if($keys = $min $keys = $max){ Eu devo ser muito estúpido... mas alguém que está falando isso (ja é o 3o), poderia fazer o favor de me explicar porque ele deve usar no lugar do 'and' e qual diferença isso faz no caso deste if específico? E em quais situações deve-se usar o 'and' no lugar de ? [ ]'s-- Bruno C. Buss http://www.brunobuss.net [1] Links: -- [1] http://www.brunobuss.net ___ 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
Re: [Rio-pm] Chaves de hash
Não funcionaria em 100% dos casos. Em 2012-11-29 23:27, Blabos de Blebe escreveu: Um exemplo hipotético... Suponha que não haja escapatória e tenha-se que comparar flutuantes... if ( float_equal( $a, $b ) ) { say 'igual'; } elsif ( $a $b !float_equal( $a, $b ) ) { say 'menor'; } else { say 'maior'; } Será que funciona? 2012/11/29 thiagogla...@ticursos.net: Um exemplo mais preciso: $ uname -a SunOS cg01spo 5.10 Generic_13-03 sun4v sparc SUNW,SPARC-Enterprise-T5120 $ perl -E ' if (0.2 0.19997){ say 0.2 is greater than 0.19997;} else { say Floating Point is not true real};' 0.2 is greater than 0.19997 $ $ perl -E ' if (0.2 0.19998){ say 0.2 is greater than 0.19998;} 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 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.1999){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' Floating Point is not true real $ $ perl -E ' if (0.2 0.19){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' 0.2 is greater than 0.19 $ 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.0001 # 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
Re: [Rio-pm] Chaves de hash
#define float_epsilon 0.1; #define float_equal(a,b) (fabs((a) - (b)) float_epsilon) Com esse define de float_equal e float_epsilon acho que funcionaria. Em 2012-11-29 23:27, Blabos de Blebe escreveu: Um exemplo hipotético... Suponha que não haja escapatória e tenha-se que comparar flutuantes... if ( float_equal( $a, $b ) ) { say 'igual'; } elsif ( $a $b !float_equal( $a, $b ) ) { say 'menor'; } else { say 'maior'; } Será que funciona? 2012/11/29 thiagogla...@ticursos.net: Um exemplo mais preciso: $ uname -a SunOS cg01spo 5.10 Generic_13-03 sun4v sparc SUNW,SPARC-Enterprise-T5120 $ perl -E ' if (0.2 0.19997){ say 0.2 is greater than 0.19997;} else { say Floating Point is not true real};' 0.2 is greater than 0.19997 $ $ perl -E ' if (0.2 0.19998){ say 0.2 is greater than 0.19998;} 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 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.1999){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' Floating Point is not true real $ $ perl -E ' if (0.2 0.19){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' 0.2 is greater than 0.19 $ 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.0001 # 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
Re: [Rio-pm] Chaves de hash
Hashs não têm mais de uma chave igual. Ele vai mudar o valor relacionado à chave e não criar outra chave com o mesmo valor. Em 2012-11-30 00:24, Aureliano Guedes escreveu: Bruno, no meu if funcionou tanto com quanto com and. O meu erro mesmo foi que a regex pegava um espasso. Bem a minha duvida ficou em porque seria problematico colocar reais em chaves de hash no meu caso? Se eu fosse pesquisar um valor especifico e tivesse duas ou mais chaves com o mesmo valor real seria problema mas no meu caso umporta que o valor esteja em um determinado intervalo, podem ter 20 chaves iguais, estando no intervalo eu quero os 20 valores. 49?? - From: leonardo.bal...@gmail.com Date: Fri, 30 Nov 2012 00:15:50 -0200 To: rio-pm@pm.org Subject: Re: [Rio-pm] Chaves de hash Quero participar dessa discussao antes do 50. Por que tanta peculiariade na dicotomia de popular? Na buzilis da cizania ja nao era mais sobre Perl ou foi impressao minha? Leo Balter - via mobile Em 30/11/2012, às 00:02, Marcio Ferreira marciodesouzaferre...@gmail.com escreveu: 47 On Nov 29, 2012 11:35 PM, Renato Santos renato.c...@gmail.com wrote: #define float_epsilon 0.1; #define float_equal(a,b) (fabs((a) - (b)) float_epsilon) BTW 2012/11/29 Blabos de Blebe bla...@gmail.com float_equal -- Saravá, Renato CRON http://www.renatocron.com/blog/ [1] @renato_cron [2] ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm [3] ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm [3] ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm Links: -- [1] http://www.renatocron.com/blog/ [2] http://twitter.com/#%21/renato_cron [3] http://mail.pm.org/mailman/listinfo/rio-pm ___ 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
Re: [Rio-pm] Chaves de hash
faça o push (só que sem a funcao), outra forma, porque não usar uma array ? e ai você coloca assim: my @hmfe; while (..){ ... push @hmfe, {valor = $mirna, registro = $record}; ... } e ai você faria o seu loop pra encontrar o valor mudando apenas $keys por $linha-{valor} foreach my $linha (@hmfe){ ... if .. } - uma coisa: eu vi que sua funcao lá de intervalo está criando tudo de novo, dependendo do caso, você pode fazer a leitura apenas uma vez, retornar o @hmfe (em referencia { return \@hmfe }, para nao duplicar na memoria) e depois usar ele na funcao que recebe o intervalo e retorna os registros. 2012/11/30 Aureliano Guedes guedes_1...@hotmail.com Biólogo não, biomedico, acredite essa diferença fere nossos sentimentos. hahaha Hashs não têm mais de uma chave igual. Ele vai mudar o valor relacionado à chave e não criar outra chave com o mesmo valor. Agora sim, isso é um problemão. Estarei perdendo dados assim. Como poderia reverter isso então?? Faria a chave ser valor e o valor ser chave?? Quais minhas opções?? sub h_energy{ my $self = shift; my $data = $self-h_data || die cannot find data; 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; } Date: Fri, 30 Nov 2012 10:30:17 -0200 From: thiagogla...@ticursos.net To: rio-pm@pm.org Subject: Re: [Rio-pm] Chaves de hash Hashs não têm mais de uma chave igual. Ele vai mudar o valor relacionado à chave e não criar outra chave com o mesmo valor. Em 2012-11-30 00:24, Aureliano Guedes escreveu: Bruno, no meu if funcionou tanto com quanto com and. O meu erro mesmo foi que a regex pegava um espasso. Bem a minha duvida ficou em porque seria problematico colocar reais em chaves de hash no meu caso? Se eu fosse pesquisar um valor especifico e tivesse duas ou mais chaves com o mesmo valor real seria problema mas no meu caso umporta que o valor esteja em um determinado intervalo, podem ter 20 chaves iguais, estando no intervalo eu quero os 20 valores. 49?? - From: leonardo.bal...@gmail.com Date: Fri, 30 Nov 2012 00:15:50 -0200 To: rio-pm@pm.org Subject: Re: [Rio-pm] Chaves de hash Quero participar dessa discussao antes do 50. Por que tanta peculiariade na dicotomia de popular? Na buzilis da cizania ja nao era mais sobre Perl ou foi impressao minha? Leo Balter - via mobile Em 30/11/2012, às 00:02, Marcio Ferreira marciodesouzaferre...@gmail.com escreveu: 47 On Nov 29, 2012 11:35 PM, Renato Santos renato.c...@gmail.com wrote: #define float_epsilon 0.1; #define float_equal(a,b) (fabs((a) - (b)) float_epsilon) BTW 2012/11/29 Blabos de Blebe bla...@gmail.com float_equal -- Saravá, Renato CRON http://www.renatocron.com/blog/ [1] @renato_cron [2] ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm [3] ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm [3] ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm Links: -- [1] http://www.renatocron.com/blog/ [2] http://twitter.com/#%21/renato_cron [3] http://mail.pm.org/mailman/listinfo/rio-pm ___ 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 ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm -- Saravá, Renato CRON http://www.renatocron.com/blog/ @renato_cron http://twitter.com/#!/renato_cron ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
Biólogo não, biomedico Putz, really sorry!!! 2 gaf. Agora sim, isso é um problemão. Estarei perdendo dados assim. Sim, estará perdendo dados. Faria a chave ser valor e o valor ser chave?? Quais minhas opções?? Não entendo de biomedicina, mas acho que deveriamos pensar em algo como uma estrutura de dados mas bem planejada. Por que você está usando o valor de calorias como chave do hash? Se você criar uma estrutura mais complexa, como array de hashs ou mesmo um array de objetos... opções não faltam. Em 2012-11-30 10:37, Aureliano Guedes escreveu: Biólogo não, biomedico, acredite essa diferença fere nossos sentimentos. hahaha Hashs não têm mais de uma chave igual. Ele vai mudar o valor relacionado à chave e não criar outra chave com o mesmo valor. Agora sim, isso é um problemão. Estarei perdendo dados assim. Como poderia reverter isso então?? Faria a chave ser valor e o valor ser chave?? Quais minhas opções?? sub h_energy{ my $self = shift; my $data = $self-h_data || die cannot find data; 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; } Date: Fri, 30 Nov 2012 10:30:17 -0200 From: thiagogla...@ticursos.net To: rio-pm@pm.org Subject: Re: [Rio-pm] Chaves de hash Hashs não têm mais de uma chave igual. Ele vai mudar o valor relacionado à chave e não criar outra chave com o mesmo valor. Em 2012-11-30 00:24, Aureliano Guedes escreveu: Bruno, no meu if funcionou tanto com quanto com and. O meu erro mesmo foi que a regex pegava um espasso. Bem a minha duvida ficou em porque seria problematico colocar reais em chaves de hash no meu caso? Se eu fosse pesquisar um valor especifico e tivesse duas ou mais chaves com o mesmo valor real seria problema mas no meu caso umporta que o valor esteja em um determinado intervalo, podem ter 20 chaves iguais, estando no intervalo eu quero os 20 valores. 49?? - From: leonardo.bal...@gmail.com Date: Fri, 30 Nov 2012 00:15:50 -0200 To: rio-pm@pm.org Subject: Re: [Rio-pm] Chaves de hash Quero participar dessa discussao antes do 50. Por que tanta peculiariade na dicotomia de popular? Na buzilis da cizania ja nao era mais sobre Perl ou foi impressao minha? Leo Balter - via mobile Em 30/11/2012, às 00:02, Marcio Ferreira marciodesouzaferre...@gmail.com escreveu: 47 On Nov 29, 2012 11:35 PM, Renato Santos renato.c...@gmail.com wrote: #define float_epsilon 0.1; #define float_equal(a,b) (fabs((a) - (b)) float_epsilon) BTW 2012/11/29 Blabos de Blebe bla...@gmail.com float_equal -- Saravá, Renato CRON http://www.renatocron.com/blog/ [1] @renato_cron [2] ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm [3] ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm [3] ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm Links: -- [1] http://www.renatocron.com/blog/ [2] http://twitter.com/#%21/renato_cron [3] http://mail.pm.org/mailman/listinfo/rio-pm ___ 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 ___ 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
Re: [Rio-pm] Chaves de hash
que toda vez que você passar termofilter('arquivo', -30, -20) todo o arquivo estaria sendo lido (o q é obvio) que por exemplo, poderia ser $dados = h_energy('arquivo.txt'); termofilter($dados, -30, -20); nesse caso, o codigo ficaria assim: http://pastebin.com/ZyWPxq9A 2012/11/30 Aureliano Guedes guedes_1...@hotmail.com Entendi, eu so não entendi a parte de uma coisa: eu vi que sua funcao lá de intervalo está criando tudo de novo, dependendo do caso, você pode fazer a leitura apenas uma vez,. O que você quis dizer com isso? -- From: renato.c...@gmail.com Date: Fri, 30 Nov 2012 10:44:24 -0200 To: rio-pm@pm.org Subject: Re: [Rio-pm] Chaves de hash faça o push (só que sem a funcao), outra forma, porque não usar uma array ? e ai você coloca assim: my @hmfe; while (..){ ... push @hmfe, {valor = $mirna, registro = $record}; ... } e ai você faria o seu loop pra encontrar o valor mudando apenas $keys por $linha-{valor} foreach my $linha (@hmfe){ ... if .. } - uma coisa: eu vi que sua funcao lá de intervalo está criando tudo de novo, dependendo do caso, você pode fazer a leitura apenas uma vez, retornar o @hmfe (em referencia { return \@hmfe }, para nao duplicar na memoria) e depois usar ele na funcao que recebe o intervalo e retorna os registros. 2012/11/30 Aureliano Guedes guedes_1...@hotmail.com Biólogo não, biomedico, acredite essa diferença fere nossos sentimentos. hahaha Hashs não têm mais de uma chave igual. Ele vai mudar o valor relacionado à chave e não criar outra chave com o mesmo valor. Agora sim, isso é um problemão. Estarei perdendo dados assim. Como poderia reverter isso então?? Faria a chave ser valor e o valor ser chave?? Quais minhas opções?? sub h_energy{ my $self = shift; my $data = $self-h_data || die cannot find data; 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; } Date: Fri, 30 Nov 2012 10:30:17 -0200 From: thiagogla...@ticursos.net To: rio-pm@pm.org Subject: Re: [Rio-pm] Chaves de hash Hashs não têm mais de uma chave igual. Ele vai mudar o valor relacionado à chave e não criar outra chave com o mesmo valor. Em 2012-11-30 00:24, Aureliano Guedes escreveu: Bruno, no meu if funcionou tanto com quanto com and. O meu erro mesmo foi que a regex pegava um espasso. Bem a minha duvida ficou em porque seria problematico colocar reais em chaves de hash no meu caso? Se eu fosse pesquisar um valor especifico e tivesse duas ou mais chaves com o mesmo valor real seria problema mas no meu caso umporta que o valor esteja em um determinado intervalo, podem ter 20 chaves iguais, estando no intervalo eu quero os 20 valores. 49?? - From: leonardo.bal...@gmail.com Date: Fri, 30 Nov 2012 00:15:50 -0200 To: rio-pm@pm.org Subject: Re: [Rio-pm] Chaves de hash Quero participar dessa discussao antes do 50. Por que tanta peculiariade na dicotomia de popular? Na buzilis da cizania ja nao era mais sobre Perl ou foi impressao minha? Leo Balter - via mobile Em 30/11/2012, às 00:02, Marcio Ferreira marciodesouzaferre...@gmail.com escreveu: 47 On Nov 29, 2012 11:35 PM, Renato Santos renato.c...@gmail.com wrote: #define float_epsilon 0.1; #define float_equal(a,b) (fabs((a) - (b)) float_epsilon) BTW 2012/11/29 Blabos de Blebe bla...@gmail.com float_equal -- Saravá, Renato CRON http://www.renatocron.com/blog/ [1] @renato_cron [2] ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm [3] ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm [3] ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm Links: -- [1] http://www.renatocron.com/blog/ [2] http://twitter.com/#%21/renato_cron [3] http://mail.pm.org/mailman/listinfo/rio-pm ___ 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
Re: [Rio-pm] Chaves de hash
O melhor seria; if ( abs($a-$b) $errro ) { say tratar como igual; } else { say tratar como diferentes; }; sendo $erro a margem de erro aceitável ($erro = 0.1, por exemplo) Caso precise comparar maior ou menor: if ( $a ($b -$erro) ) { say tratar como maior; } if ( $a ($b + $erro) ) { say tratar como menor; } Umas das primeiras coisa que são ensinados em cursos de cálculo numérico é tratamento de erro. Att Mosconi Em 29 de novembro de 2012 23:27, Blabos de Blebe bla...@gmail.com escreveu: Um exemplo hipotético... Suponha que não haja escapatória e tenha-se que comparar flutuantes... if ( float_equal( $a, $b ) ) { say 'igual'; } elsif ( $a $b !float_equal( $a, $b ) ) { say 'menor'; } else { say 'maior'; } Será que funciona? 2012/11/29 thiagogla...@ticursos.net: Um exemplo mais preciso: $ uname -a SunOS cg01spo 5.10 Generic_13-03 sun4v sparc SUNW,SPARC-Enterprise-T5120 $ perl -E ' if (0.2 0.19997){ say 0.2 is greater than 0.19997;} else { say Floating Point is not true real};' 0.2 is greater than 0.19997 $ $ perl -E ' if (0.2 0.19998){ say 0.2 is greater than 0.19998;} 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 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.1999){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' Floating Point is not true real $ $ perl -E ' if (0.2 0.19){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' 0.2 is greater than 0.19 $ 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.0001 # 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,
Re: [Rio-pm] Chaves de hash
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 ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
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.1999){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' Floating Point is not true real $ $ perl -E ' if (0.2 0.19){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' 0.2 is greater than 0.19 $ 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.0001 # 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 ___ 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 ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
Um exemplo mais preciso: $ uname -a SunOS cg01spo 5.10 Generic_13-03 sun4v sparc SUNW,SPARC-Enterprise-T5120 $ perl -E ' if (0.2 0.19997){ say 0.2 is greater than 0.19997;} else { say Floating Point is not true real};' 0.2 is greater than 0.19997 $ $ perl -E ' if (0.2 0.19998){ say 0.2 is greater than 0.19998;} 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 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.1999){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' Floating Point is not true real $ $ perl -E ' if (0.2 0.19){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' 0.2 is greater than 0.19 $ 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.0001 # 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 ___ 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 ___ Rio-pm mailing list Rio-pm@pm.org
Re: [Rio-pm] Chaves de hash
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' CUCUCCUGUGGUCUCU G U 3' CACA GACCAGUGCUGUU GUGU UUGGUCACGACGA miRNA 3' AAUAU 5' Conforme este arquivo http://pastebin.com/9v6WFUT7 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 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_13-03 sun4v sparc SUNW,SPARC-Enterprise-T5120 $ perl -E ' if (0.2 0.19997){ say 0.2 is greater than 0.19997;} else { say Floating Point is not true real};' 0.2 is greater than 0.19997 $ $ perl -E ' if (0.2 0.19998){ say 0.2 is greater than 0.19998;} 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 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.1999){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' Floating Point is not true real $ $ perl -E ' if (0.2 0.19){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' 0.2 is greater than 0.19 $ 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.0001 # 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
Re: [Rio-pm] Chaves de hash
Caso a entrada file($data)-openr(); na linha 9 retorne um filehandle vale a pena dar um close $file; antes de retornar o valor da sub também. []'s * Daniel Vinciguerra* Web Solutions Architect and Co-Owner at Bivee http://github.com/dvinciguerra http://github.com/dvinciguerra 2012/11/29 Aureliano Guedes guedes_1...@hotmail.com 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' CUCUCCUGUGGUCUCU G U 3' CACA GACCAGUGCUGUU GUGU UUGGUCACGACGA miRNA 3' AAUAU 5' Conforme este arquivo http://pastebin.com/9v6WFUT7 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 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_13-03 sun4v sparc SUNW,SPARC-Enterprise-T5120 $ perl -E ' if (0.2 0.19997){ say 0.2 is greater than 0.19997;} else { say Floating Point is not true real};' 0.2 is greater than 0.19997 $ $ perl -E ' if (0.2 0.19998){ say 0.2 is greater than 0.19998;} 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 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.1999){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' Floating Point is not true real $ $ perl -E ' if (0.2 0.19){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' 0.2 is greater than 0.19 $ 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.0001 # 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
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 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 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_13-03 sun4v sparc SUNW,SPARC-Enterprise-T5120 $ perl -E ' if (0.2 0.19997){ say 0.2 is greater than 0.19997;} else { say Floating Point is not true real};' 0.2 is greater than 0.19997 $ $ perl -E ' if (0.2 0.19998){ say 0.2 is greater than 0.19998;} 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 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.1999){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' Floating Point is not true real $ $ perl -E ' if (0.2 0.19){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' 0.2 is greater than 0.19 $ 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.0001 # 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
Re: [Rio-pm] Chaves de hash
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 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 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_13-03 sun4v sparc SUNW,SPARC-Enterprise-T5120 $ perl -E ' if (0.2 0.19997){ say 0.2 is greater than 0.19997;} else { say Floating Point is not true real};' 0.2 is greater than 0.19997 $ $ perl -E ' if (0.2 0.19998){ say 0.2 is greater than 0.19998;} 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 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.1999){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' Floating Point is not true real $ $ perl -E ' if (0.2 0.19){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' 0.2 is greater than 0.19 $ 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
Re: [Rio-pm] Chaves de hash
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 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 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_13-03 sun4v sparc SUNW,SPARC-Enterprise-T5120 $ perl -E ' if (0.2 0.19997){ say 0.2 is greater than 0.19997;} else { say Floating Point is not true real};' 0.2 is greater than 0.19997 $ $ perl -E ' if (0.2 0.19998){ say 0.2 is greater than 0.19998;} 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 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.1999){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' Floating Point is not true real $ $ perl -E ' if (0.2 0.19){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' 0.2 is greater than 0.19 $ Então, comparar pontos flutuantes não é seguro. Nem igualdade, nem maio
Re: [Rio-pm] Chaves de hash
Seu primeiro erro é o operador and. No documento perlop: $ perldoc perlop você vai descobrir o seguinte: Logical And Binary and returns the logical conjunction of the two surrounding expressions. It's equivalent to except for the very low precedence. This means that it short-circuits: i.e., the right expression is evaluated only if the left expression is true. [...] C-style Logical And Binary performs a short-circuit logical AND operation. That is, if the left operand is false, the right operand is not even evaluated. Scalar or list context propagates down to the right operand if it is evaluated. Logo, seu código if($keys = $min and $keys = $max){ deveria ser if($keys = $min $keys = $max){ A segunda coisa é o seu range. Não sei a precisão que seu código precisa. Veja isso: $ perl -E ' if (-30.1 = -30 ){ say -30.1 is equal -30? Really;} else { say Floating Point is not true real};' -30.1 is equal -30? Really $ Eu faria algo como: if($keys $min and $keys $max) e, usaria, por exemplo -30.01 como min e -20.01 como max, por exemplo, para contornar o ponto flutuante, ou usaria um módulo matemático, como o Math::BigFloat. http://perldoc.perl.org/Math/BigFloat.html Eu nunca usei em algo que fosse crítico, mas me parece bem sólida e segura. Em 2012-11-29 18:46, Aureliano Guedes escreveu: 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 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 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_13-03 sun4v sparc SUNW,SPARC-Enterprise-T5120 $ perl -E ' if (0.2 0.19997){ say 0.2 is greater than 0.19997;} else { say Floating Point is not true real};' 0.2 is greater than 0.19997 $ $ perl -E ' if (0.2 0.19998){ say 0.2 is greater than 0.19998;} 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 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
Re: [Rio-pm] Chaves de hash
eu prefiro geralmente multiplicar por 1+N casas e usar apenas o numero inteiro, se a quantidade de casas for pequena, *é mais rapido* do que ligar uma lib externa pra processar numeros. ps: teoricamente é mais rapido, não fiz testes para tal 2012/11/29 thiagogla...@ticursos.net Seu primeiro erro é o operador and. No documento perlop: $ perldoc perlop você vai descobrir o seguinte: Logical And Binary and returns the logical conjunction of the two surrounding expressions. It's equivalent to except for the very low precedence. This means that it short-circuits: i.e., the right expression is evaluated only if the left expression is true. [...] C-style Logical And Binary performs a short-circuit logical AND operation. That is, if the left operand is false, the right operand is not even evaluated. Scalar or list context propagates down to the right operand if it is evaluated. Logo, seu código if($keys = $min and $keys = $max){ deveria ser if($keys = $min $keys = $max){ A segunda coisa é o seu range. Não sei a precisão que seu código precisa. Veja isso: $ perl -E ' if (-30.1 = -30 ){ say -30.1 is equal -30? Really;} else { say Floating Point is not true real};' -30.1 is equal -30? Really $ Eu faria algo como: if($keys $min and $keys $max) e, usaria, por exemplo -30.01 como min e -20.01 como max, por exemplo, para contornar o ponto flutuante, ou usaria um módulo matemático, como o Math::BigFloat. http://perldoc.perl.org/Math/**BigFloat.htmlhttp://perldoc.perl.org/Math/BigFloat.html Eu nunca usei em algo que fosse crítico, mas me parece bem sólida e segura. Em 2012-11-29 18:46, Aureliano Guedes escreveu: 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 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 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_13-03 sun4v sparc SUNW,SPARC-Enterprise-T5120 $ perl -E ' if (0.2 0.19997){ say 0.2 is greater than 0.19997;} else { say Floating Point is not true real};' 0.2 is greater than 0.19997 $ $ perl -E ' if (0.2 0.19998){ say 0.2 is greater than 0.19998;} else { say Floating Point
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_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_13-03 sun4v sparc SUNW,SPARC-Enterprise-T5120 $ perl -E ' if (0.2 0.19997){ say 0.2 is greater than 0.19997;} else { say Floating Point is not true real};' 0.2 is greater than 0.19997 $ $ perl -E ' if (0.2 0.19998){ say 0.2 is greater than 0.19998;} 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
Re: [Rio-pm] Chaves de hash
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: thiagogla...@ticursos.net To: rio-pm@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_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
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_1...@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: thiagogla...@ticursos.net To: rio-pm@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_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
Re: [Rio-pm] Chaves de hash
pra evitar 'QUANDO EU COMPREI, FUNCIONAVA RAPIDO' 2012/11/29 Tiago Peczenyj tiago.pecze...@gmail.com Olha... tinha uma gem pra ruby que adicionava uns sleeps no codigo pra deixar propositalmente lento para demonstrações enterprise. Afinal se é rapido, não é sistema web interno corporativo. -- Saravá, Renato CRON http://www.renatocron.com/blog/ @renato_cron http://twitter.com/#!/renato_cron ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
o or é facil my $xxx = open (mimimi) or die ops..; eu posso usar o and no mesmo contexto. $self-upload_file_if_necessary($keyname,$file) and $self-change_acl_to_public_read($keyname) and $self-delete_file($file) and $self-on_success($file) or $self-on_error($file) ou seja, se o change_acl_to_public_read retornar falso, eu vou executar on_error On Thu, Nov 29, 2012 at 10:09 PM, Bruno Buss bruno.b...@gmail.com wrote: 2012/11/29 thiagogla...@ticursos.net Seu primeiro erro é o operador and. No documento perlop: $ perldoc perlop você vai descobrir o seguinte: Logical And Binary and returns the logical conjunction of the two surrounding expressions. It's equivalent to except for the very low precedence. This means that it short-circuits: i.e., the right expression is evaluated only if the left expression is true. [...] C-style Logical And Binary performs a short-circuit logical AND operation. That is, if the left operand is false, the right operand is not even evaluated. Scalar or list context propagates down to the right operand if it is evaluated. Logo, seu código if($keys = $min and $keys = $max){ deveria ser if($keys = $min $keys = $max){ Eu devo ser muito estúpido... mas alguém que está falando isso (ja é o 3o), poderia fazer o favor de me explicar porque ele deve usar no lugar do 'and' e qual diferença isso faz no caso deste if específico? E em quais situações deve-se usar o 'and' no lugar de ? [ ]'s -- Bruno C. Buss http://www.brunobuss.net ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm -- Tiago B. Peczenyj Linux User #405772 http://pacman.blog.br ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
2012/11/29 Bruno Buss bruno.b...@gmail.com On Thu, Nov 29, 2012 at 10:13 PM, Renato Santos renato.c...@gmail.comwrote: use sempre e seja feliz, só use and quando você souber oque está fazendo. Desculpe mas vou discordar que um bom conselho seja use sempre e seja feliz, ainda mais seguido de só use and quando você souber oque está fazendo. Na melhor da hipóteses são sugestões contraditórias... como alguém deverá saber quando usar o 'and' se apenas usa o cegamente? o 'and' é praticamente o 'e' da nossa lingua, vc diz pro seu codigo 'faça isso, e isso', ele não é de comparação, embora faça ele não é de comparação, embora faça? Poderia desenvolver melhor, pois não fui incapaz de entender o que isso significa para um operador lógico (que a única diferença do outro é a baixa precedência). s/incapaz/capaz/; E vou repetir a pergunta aqui, antes que ela fique soterrada pelas tricks de sleep: Qual diferença isso faz no caso deste if específico do Aureliano? Por que exatamente, no if dele, utilizar o 'and' está incorreto? Porque no if dele, somente o dá certo como 3 pessoas já disseram? -- Bruno C. Buss http://www.brunobuss.net -- Bruno C. Buss http://www.brunobuss.net ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
veja este exemplo: https://gist.github.com/4172935 veja como a execução das subrotinas não é alterada, mas o resultado das variaveis é diferente. my $x = a and b and c and ok or nok; my $y = a b c ok || nok; veja que x recebe o valor que a retorna, enquanto y recebe o valor de nok. isso pq o = esta em termos de precedencia entre o and e o 2012/11/29 Bruno Buss bruno.b...@gmail.com 2012/11/29 Bruno Buss bruno.b...@gmail.com On Thu, Nov 29, 2012 at 10:13 PM, Renato Santos renato.c...@gmail.comwrote: use sempre e seja feliz, só use and quando você souber oque está fazendo. Desculpe mas vou discordar que um bom conselho seja use sempre e seja feliz, ainda mais seguido de só use and quando você souber oque está fazendo. Na melhor da hipóteses são sugestões contraditórias... como alguém deverá saber quando usar o 'and' se apenas usa o cegamente? o 'and' é praticamente o 'e' da nossa lingua, vc diz pro seu codigo 'faça isso, e isso', ele não é de comparação, embora faça ele não é de comparação, embora faça? Poderia desenvolver melhor, pois não fui incapaz de entender o que isso significa para um operador lógico (que a única diferença do outro é a baixa precedência). s/incapaz/capaz/; E vou repetir a pergunta aqui, antes que ela fique soterrada pelas tricks de sleep: Qual diferença isso faz no caso deste if específico do Aureliano? Por que exatamente, no if dele, utilizar o 'and' está incorreto? Porque no if dele, somente o dá certo como 3 pessoas já disseram? -- Bruno C. Buss http://www.brunobuss.net -- Bruno C. Buss http://www.brunobuss.net ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm -- Tiago B. Peczenyj Linux User #405772 http://pacman.blog.br ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
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 thiagogla...@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_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_13-03 sun4v sparc SUNW,SPARC-Enterprise-T5120 $ perl -E ' if (0.2 0.19997){ say 0.2 is greater than 0.19997;} else { say Floating Point is not true real};' 0.2 is greater than 0.19997 $ $ perl -E ' if (0.2 0.19998){ say 0.2 is greater than 0.19998;} else { say Floating Point is not true real
Re: [Rio-pm] Chaves de hash
Porra PAC, não pisa fora da faixa, cara! :) http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity É só aplicar as regras de precedência. Parafraseando o perldoc, and é 'equivalent to except for the very low precedence' É óbvio gente. Assim vcs me envergonham! Game over. 2012/11/29 Tiago Peczenyj tiago.pecze...@gmail.com: veja este exemplo: https://gist.github.com/4172935 veja como a execução das subrotinas não é alterada, mas o resultado das variaveis é diferente. my $x = a and b and c and ok or nok; my $y = a b c ok || nok; veja que x recebe o valor que a retorna, enquanto y recebe o valor de nok. isso pq o = esta em termos de precedencia entre o and e o 2012/11/29 Bruno Buss bruno.b...@gmail.com 2012/11/29 Bruno Buss bruno.b...@gmail.com On Thu, Nov 29, 2012 at 10:13 PM, Renato Santos renato.c...@gmail.com wrote: use sempre e seja feliz, só use and quando você souber oque está fazendo. Desculpe mas vou discordar que um bom conselho seja use sempre e seja feliz, ainda mais seguido de só use and quando você souber oque está fazendo. Na melhor da hipóteses são sugestões contraditórias... como alguém deverá saber quando usar o 'and' se apenas usa o cegamente? o 'and' é praticamente o 'e' da nossa lingua, vc diz pro seu codigo 'faça isso, e isso', ele não é de comparação, embora faça ele não é de comparação, embora faça? Poderia desenvolver melhor, pois não fui incapaz de entender o que isso significa para um operador lógico (que a única diferença do outro é a baixa precedência). s/incapaz/capaz/; E vou repetir a pergunta aqui, antes que ela fique soterrada pelas tricks de sleep: Qual diferença isso faz no caso deste if específico do Aureliano? Por que exatamente, no if dele, utilizar o 'and' está incorreto? Porque no if dele, somente o dá certo como 3 pessoas já disseram? -- Bruno C. Buss http://www.brunobuss.net -- Bruno C. Buss http://www.brunobuss.net ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm -- Tiago B. Peczenyj Linux User #405772 http://pacman.blog.br ___ 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
Re: [Rio-pm] Chaves de hash
já está chegando em 50 mensagens na thread, quem irá citar ele ? Em quinta-feira, 29 de novembro de 2012, Blabos de Blebebla...@gmail.com escreveu: 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 thiagogla...@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_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 mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
Só a gente mesmo pra ficar discutindo nota de rodapé de livro :) 2012/11/29 Vinícius Miasato viniciusmias...@gmail.com: já está chegando em 50 mensagens na thread, quem irá citar ele ? Em quinta-feira, 29 de novembro de 2012, Blabos de Blebebla...@gmail.com escreveu: 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 thiagogla...@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_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 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
Re: [Rio-pm] Chaves de hash
Um exemplo hipotético... Suponha que não haja escapatória e tenha-se que comparar flutuantes... if ( float_equal( $a, $b ) ) { say 'igual'; } elsif ( $a $b !float_equal( $a, $b ) ) { say 'menor'; } else { say 'maior'; } Será que funciona? 2012/11/29 thiagogla...@ticursos.net: Um exemplo mais preciso: $ uname -a SunOS cg01spo 5.10 Generic_13-03 sun4v sparc SUNW,SPARC-Enterprise-T5120 $ perl -E ' if (0.2 0.19997){ say 0.2 is greater than 0.19997;} else { say Floating Point is not true real};' 0.2 is greater than 0.19997 $ $ perl -E ' if (0.2 0.19998){ say 0.2 is greater than 0.19998;} 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 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.1999){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' Floating Point is not true real $ $ perl -E ' if (0.2 0.19){ say 0.2 is greater than 0.19;} else { say Floating Point is not true real};' 0.2 is greater than 0.19 $ 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.0001 # 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
Re: [Rio-pm] Chaves de hash
#define float_epsilon 0.1;#define float_equal(a,b) (fabs((a) - (b)) float_epsilon) *BTW* 2012/11/29 Blabos de Blebe bla...@gmail.com float_equal -- Saravá, Renato CRON http://www.renatocron.com/blog/ @renato_cron http://twitter.com/#!/renato_cron ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
Quero participar dessa discussao antes do 50. Por que tanta peculiariade na dicotomia de popular? Na buzilis da cizania ja nao era mais sobre Perl ou foi impressao minha? Leo Balter - via mobile Em 30/11/2012, às 00:02, Marcio Ferreira marciodesouzaferre...@gmail.com escreveu: 47 On Nov 29, 2012 11:35 PM, Renato Santos renato.c...@gmail.com wrote: #define float_epsilon 0.1; #define float_equal(a,b) (fabs((a) - (b)) float_epsilon) BTW 2012/11/29 Blabos de Blebe bla...@gmail.com float_equal -- Saravá, Renato CRON http://www.renatocron.com/blog/ @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 ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
Bruno, no meu if funcionou tanto com quanto com and. O meu erro mesmo foi que a regex pegava um espasso. Bem a minha duvida ficou em porque seria problematico colocar reais em chaves de hash no meu caso? Se eu fosse pesquisar um valor especifico e tivesse duas ou mais chaves com o mesmo valor real seria problema mas no meu caso umporta que o valor esteja em um determinado intervalo, podem ter 20 chaves iguais, estando no intervalo eu quero os 20 valores. 49?? From: leonardo.bal...@gmail.com Date: Fri, 30 Nov 2012 00:15:50 -0200 To: rio-pm@pm.org Subject: Re: [Rio-pm] Chaves de hash Quero participar dessa discussao antes do 50. Por que tanta peculiariade na dicotomia de popular? Na buzilis da cizania ja nao era mais sobre Perl ou foi impressao minha? Leo Balter - via mobile Em 30/11/2012, às 00:02, Marcio Ferreira marciodesouzaferre...@gmail.com escreveu: 47 On Nov 29, 2012 11:35 PM, Renato Santos renato.c...@gmail.com wrote: #define float_epsilon 0.1; #define float_equal(a,b) (fabs((a) - (b)) float_epsilon) BTW 2012/11/29 Blabos de Blebe bla...@gmail.com float_equal -- Saravá, Renato CRONhttp://www.renatocron.com/blog/ @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 ___ 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
Re: [Rio-pm] Chaves de hash
Todos sabem que a WWII foi desencadeada por causa da festa de aniversário de 50 anos de Hitler. ABS() 2012/11/30 Aureliano Guedes guedes_1...@hotmail.com Bruno, no meu if funcionou tanto com quanto com and. O meu erro mesmo foi que a regex pegava um espasso. Bem a minha duvida ficou em porque seria problematico colocar reais em chaves de hash no meu caso? Se eu fosse pesquisar um valor especifico e tivesse duas ou mais chaves com o mesmo valor real seria problema mas no meu caso umporta que o valor esteja em um determinado intervalo, podem ter 20 chaves iguais, estando no intervalo eu quero os 20 valores. 49?? -- From: leonardo.bal...@gmail.com Date: Fri, 30 Nov 2012 00:15:50 -0200 To: rio-pm@pm.org Subject: Re: [Rio-pm] Chaves de hash Quero participar dessa discussao antes do 50. Por que tanta peculiariade na dicotomia de popular? Na buzilis da cizania ja nao era mais sobre Perl ou foi impressao minha? Leo Balter - via mobile Em 30/11/2012, às 00:02, Marcio Ferreira marciodesouzaferre...@gmail.com escreveu: 47 On Nov 29, 2012 11:35 PM, Renato Santos renato.c...@gmail.com wrote: #define float_epsilon 0.1;#define float_equal(a,b) (fabs((a) - (b)) float_epsilon) *BTW* 2012/11/29 Blabos de Blebe bla...@gmail.com float_equal -- Saravá, Renato CRON http://www.renatocron.com/blog/ @renato_cron http://twitter.com/#%21/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 ___ 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 ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
obs: perl -E 'sub a{my $x = shift() * 1000; $x = int($x/200)*200; $x}; say a -0.7; say a -0.8' -600 -800 como esta arredondando via truncate, o 79 geralmente deveria estar no grupo do 800, OU NÃO! você que decide isso 2012/11/30 Renato Santos renato.c...@gmail.com pronto, na 51 eu respondo! 2012/11/30 Aureliano Guedes guedes_1...@hotmail.com Bruno, no meu if funcionou tanto com quanto com and. O meu erro mesmo foi que a regex pegava um espasso. pois é, vai funcionar! #no more comments Bem a minha duvida ficou em porque seria problematico colocar reais em chaves de hash no meu caso? tenho quase certeza que, como já foi removido de um texto, o numero real em questão, seja apenas um scalar, sem a flag de 'real' (se é existe essa flag internamente), portanto, você pode colocar qualquer coisa nas chaves de um hash sem problema (to em duvida se existe algum byte especial que é usado para separar as chaves internamente, esse valor fica em uma das variaveis magicas) Se eu fosse pesquisar um valor especifico e tivesse duas ou mais chaves com o mesmo valor real seria problema você tem que pesquisar exatamente o valor desejado, mas não tem problema pois você esta percorrendo todas as chaves mas no meu caso *i*mporta que o valor estej*e *em um determinado intervalo, podem ter 20 chaves iguais, estando no intervalo eu quero os 20 valores. 49?? que? 20 chaves iguais não pode! voltando a que eu respondi no email via celular, eu faria o codigo de outra forma, se for possivel e os intervalos forem já predetermindados: no lugar de $hmfe{$mirna} = $record if ($mirna); eu já montaria ( fill, populate, do the inserts ) o hash com as chaves já sendo o intervalo, calculado por uma funcao (que eu chameria de filtro) push(@{$hmfe{determina_intervalo($mirna)}, $record} if ($mirna); $truncate = 1000; # isso transforma -0.123456789 em -0.123 e desconsidera o que estiver na frente do 3. o round-up transformaria em 0.12*4* * * sub determina_intervalo { my $valor = shift; # isso so faz o truncate $valor = int ($valor * $truncate) / $truncate; # depois separa em grupos de 200: $valor *= 1000; return int($valor/200)*200; # isso retorna só '200' que ja vale, mas poderia ser tambem: my $tmp = int($valor/200)*200; retrun $tmp:.$tmp+200 # que vai retornar '-400:-200' que } e assim o valor da chave do intervalo já contem todos os registros daquele intervalo, nem de if precisa! perl -E 'sub a{my $x = shift() * 1000; $x = int($x/200)*200; $x}; say a -0.12; say a -0.23; say a -0.25; say a -0.26; say a -5; say a -0.29; say a -0.5; say a -0.71' 0 -200 -200 -200 -5000 -200 -400 -600 -- From: leonardo.bal...@gmail.com Date: Fri, 30 Nov 2012 00:15:50 -0200 To: rio-pm@pm.org Subject: Re: [Rio-pm] Chaves de hash Quero participar dessa discussao antes do 50. Por que tanta peculiariade na dicotomia de popular? Na buzilis da cizania ja nao era mais sobre Perl ou foi impressao minha? Leo Balter - via mobile Em 30/11/2012, às 00:02, Marcio Ferreira marciodesouzaferre...@gmail.com escreveu: 47 On Nov 29, 2012 11:35 PM, Renato Santos renato.c...@gmail.com wrote: #define float_epsilon 0.1;#define float_equal(a,b) (fabs((a) - (b)) float_epsilon) *BTW* 2012/11/29 Blabos de Blebe bla...@gmail.com float_equal -- Saravá, Renato CRON http://www.renatocron.com/blog/ @renato_cron http://twitter.com/#%21/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 ___ 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 -- Saravá, Renato CRON http://www.renatocron.com/blog/ @renato_cron http://twitter.com/#!/renato_cron -- Saravá, Renato CRON http://www.renatocron.com/blog/ @renato_cron http://twitter.com/#!/renato_cron ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
eu com a mania de corrigir o certo! é esteja mesmo! 2012/11/30 Renato Santos renato.c...@gmail.com estej*e* -- Saravá, Renato CRON http://www.renatocron.com/blog/ @renato_cron http://twitter.com/#!/renato_cron ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
VERDADE! HAHA Mas acho que estamos com um problema aqui de nomes. talvez assim fique mais claro: foreach my $numero (keys %d) { if ($numero = $min ) { # atencao, numeros iguais entram aqui print $numero tem valor $d{$numero} e eh menor que $min\n; }elsif ($numero $min ) { print $numero tem valor $d{$numero} e eh maior que $max\n; } } 2012/11/28 Ole Peter Smith ole@gmail.com como que keys sera menor do min e maior do que max? so se os tres sao iguais nao? if keys =min min=keys if krys = max max=keys 0le Send via Android On Nov 28, 2012 9:43 PM, Aureliano Guedes guedes_1...@hotmail.com wrote: 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 ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm -- Saravá, Renato CRON http://www.renatocron.com/blog/ @renato_cron http://twitter.com/#!/renato_cron ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
Sim, o seu exemplo é a perfeita demonstração do que eu disse: a única diferença é que você não consegue fazer short-circuit com 'and', só com ''. A menos que o sinal de = e = agora tenha algum side-effect como o '++', eu não particularmente não consigo chegar numa linha razoável de raciocínio para reclamar do , and e precedências no if do Aureliano. [ ]'s 2012/11/28 Renato Santos renato.c...@gmail.com Acho que o que o Marcio disse isso pois o *and* computa ambos os lados da expressão, para então retornar um boolean (ou continuar a sequencia de computar mais 'ands' e 'ors') $x = 0; $x and $x++; # $x = 1 $y = 0; $y $y++; # $y = 0 perl -e 'use v5.14.0;use v5.14.0; my $m=0; say $m $m++; say $m' *0* 0 perl -e 'use v5.14.0;use v5.14.0; my $m=0; say $m and $m++; say $m' *0* 1 o retorno foi o mesmo, mas o comportamento não. 2012/11/28 Bruno Buss bruno.b...@gmail.com @Thiago e Marcio: O que vocês estão falando? Pelo amor de Larry... O operador 'and' é *exatamente* igual ao '', tirando o nível de precedência... onde o 'and' é um dos que tem a precedência mais baixa. (perldoc perlop por favor...) Ou seja, você pode fazer tudo que faz com '' com 'and', menos contar com short-circuit em condicionais ;) -- Saravá, Renato CRON http://www.renatocron.com/blog/ @renato_cron http://twitter.com/#!/renato_cron ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm -- Bruno C. Buss http://www.brunobuss.net ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
TRUCO!!! perl -E '$a=0; 0 and $a=1; say $a' perl -E '$a=0; say 0 and $a=1; say $a' A pegadinha fica como exercício... 2012/11/28 Bruno Buss bruno.b...@gmail.com: Sim, o seu exemplo é a perfeita demonstração do que eu disse: a única diferença é que você não consegue fazer short-circuit com 'and', só com ''. A menos que o sinal de = e = agora tenha algum side-effect como o '++', eu não particularmente não consigo chegar numa linha razoável de raciocínio para reclamar do , and e precedências no if do Aureliano. [ ]'s 2012/11/28 Renato Santos renato.c...@gmail.com Acho que o que o Marcio disse isso pois o and computa ambos os lados da expressão, para então retornar um boolean (ou continuar a sequencia de computar mais 'ands' e 'ors') $x = 0; $x and $x++; # $x = 1 $y = 0; $y $y++; # $y = 0 perl -e 'use v5.14.0;use v5.14.0; my $m=0; say $m $m++; say $m' 0 0 perl -e 'use v5.14.0;use v5.14.0; my $m=0; say $m and $m++; say $m' 0 1 o retorno foi o mesmo, mas o comportamento não. 2012/11/28 Bruno Buss bruno.b...@gmail.com @Thiago e Marcio: O que vocês estão falando? Pelo amor de Larry... O operador 'and' é *exatamente* igual ao '', tirando o nível de precedência... onde o 'and' é um dos que tem a precedência mais baixa. (perldoc perlop por favor...) Ou seja, você pode fazer tudo que faz com '' com 'and', menos contar com short-circuit em condicionais ;) -- Saravá, Renato CRON http://www.renatocron.com/blog/ @renato_cron ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm -- Bruno C. Buss http://www.brunobuss.net ___ 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
Re: [Rio-pm] Chaves de hash
perl -MO=Deparse pra descobrir as pegadinhas 2012/11/28 Blabos de Blebe bla...@gmail.com TRUCO!!! perl -E '$a=0; 0 and $a=1; say $a' perl -E '$a=0; say 0 and $a=1; say $a' A pegadinha fica como exercício... 2012/11/28 Bruno Buss bruno.b...@gmail.com: Sim, o seu exemplo é a perfeita demonstração do que eu disse: a única diferença é que você não consegue fazer short-circuit com 'and', só com ''. A menos que o sinal de = e = agora tenha algum side-effect como o '++', eu não particularmente não consigo chegar numa linha razoável de raciocínio para reclamar do , and e precedências no if do Aureliano. [ ]'s 2012/11/28 Renato Santos renato.c...@gmail.com Acho que o que o Marcio disse isso pois o and computa ambos os lados da expressão, para então retornar um boolean (ou continuar a sequencia de computar mais 'ands' e 'ors') $x = 0; $x and $x++; # $x = 1 $y = 0; $y $y++; # $y = 0 perl -e 'use v5.14.0;use v5.14.0; my $m=0; say $m $m++; say $m' 0 0 perl -e 'use v5.14.0;use v5.14.0; my $m=0; say $m and $m++; say $m' 0 1 o retorno foi o mesmo, mas o comportamento não. 2012/11/28 Bruno Buss bruno.b...@gmail.com @Thiago e Marcio: O que vocês estão falando? Pelo amor de Larry... O operador 'and' é *exatamente* igual ao '', tirando o nível de precedência... onde o 'and' é um dos que tem a precedência mais baixa. (perldoc perlop por favor...) Ou seja, você pode fazer tudo que faz com '' com 'and', menos contar com short-circuit em condicionais ;) -- Saravá, Renato CRON http://www.renatocron.com/blog/ @renato_cron ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm -- Bruno C. Buss http://www.brunobuss.net ___ 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 -- Saravá, Renato CRON http://www.renatocron.com/blog/ @renato_cron http://twitter.com/#!/renato_cron ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm
Re: [Rio-pm] Chaves de hash
Ok, estava errado sobre o short circuit =P [ ]'s 2012/11/28 Blabos de Blebe bla...@gmail.com TRUCO!!! perl -E '$a=0; 0 and $a=1; say $a' perl -E '$a=0; say 0 and $a=1; say $a' A pegadinha fica como exercício... 2012/11/28 Bruno Buss bruno.b...@gmail.com: Sim, o seu exemplo é a perfeita demonstração do que eu disse: a única diferença é que você não consegue fazer short-circuit com 'and', só com ''. A menos que o sinal de = e = agora tenha algum side-effect como o '++', eu não particularmente não consigo chegar numa linha razoável de raciocínio para reclamar do , and e precedências no if do Aureliano. [ ]'s 2012/11/28 Renato Santos renato.c...@gmail.com Acho que o que o Marcio disse isso pois o and computa ambos os lados da expressão, para então retornar um boolean (ou continuar a sequencia de computar mais 'ands' e 'ors') $x = 0; $x and $x++; # $x = 1 $y = 0; $y $y++; # $y = 0 perl -e 'use v5.14.0;use v5.14.0; my $m=0; say $m $m++; say $m' 0 0 perl -e 'use v5.14.0;use v5.14.0; my $m=0; say $m and $m++; say $m' 0 1 o retorno foi o mesmo, mas o comportamento não. 2012/11/28 Bruno Buss bruno.b...@gmail.com @Thiago e Marcio: O que vocês estão falando? Pelo amor de Larry... O operador 'and' é *exatamente* igual ao '', tirando o nível de precedência... onde o 'and' é um dos que tem a precedência mais baixa. (perldoc perlop por favor...) Ou seja, você pode fazer tudo que faz com '' com 'and', menos contar com short-circuit em condicionais ;) -- Saravá, Renato CRON http://www.renatocron.com/blog/ @renato_cron ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm -- Bruno C. Buss http://www.brunobuss.net ___ 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 -- Bruno C. Buss http://www.brunobuss.net ___ Rio-pm mailing list Rio-pm@pm.org http://mail.pm.org/mailman/listinfo/rio-pm