[Rio-pm] Chaves de hash

Vinícius Miasato viniciusmiasato em gmail.com
Terça Dezembro 4 09:23:04 PST 2012


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
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20121204/aab62327/attachment-0001.html>


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