[Rio-pm] Chaves de hash

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


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


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