[Rio-pm] Chaves de hash

Blabos de Blebe blabos em gmail.com
Terça Dezembro 4 08:00:45 PST 2012


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


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