[Rio-pm] Chaves de hash

Aureliano Guedes guedes_1000 em hotmail.com
Terça Dezembro 4 09:44:38 PST 2012


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: viniciusmiasato em gmail.com
To: rio-pm em pm.org
Subject: Re: [Rio-pm] Chaves de hash

last;

Em 4 de dezembro de 2012 14:54, Blabos de Blebe <blabos em 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 <juniiior182 em 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 <blabos em 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  <thiagoglauco em 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 <thiagoglauco em 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 em pm.org

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

>> >

>> >

>> > _______________________________________________

>> > Rio-pm mailing list

>> > Rio-pm em pm.org

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

>> _______________________________________________

>> Rio-pm mailing list

>> Rio-pm em pm.org

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

>

>

>

> _______________________________________________

> Rio-pm mailing list

> Rio-pm em pm.org

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

_______________________________________________

Rio-pm mailing list

Rio-pm em pm.org

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




_______________________________________________
Rio-pm mailing list
Rio-pm em pm.org
http://mail.pm.org/mailman/listinfo/rio-pm 		 	   		  
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20121204/1ccfd8ac/attachment.html>


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