[Rio-pm] Chaves de hash

Junior Moraes juniiior182 em gmail.com
Terça Dezembro 4 08:19:28 PST 2012


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


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