> (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 >> > 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