[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