Re: [Rio-pm] Chaves de hash

2012-12-04 Thread Blabos de Blebe
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  :
>> 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 
>>
>>> 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@pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>
>
> ___
> Rio-pm mailing list
> Rio-pm@pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm


Re: [Rio-pm] Chaves de hash

2012-12-04 Thread Aureliano Guedes

Alguem passa um exemplo onde esteja evidente a diferença entre & && e and!
Um caso onde em um de certo e em outro não!

> From: bla...@gmail.com
> Date: Tue, 4 Dec 2012 14:00:45 -0200
> To: rio-pm@pm.org
> Subject: Re: [Rio-pm] Chaves de hash
> 
> 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  :
> >> 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 
> >>
> >>> 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@pm.org
> >> http://mail.pm.org/mailman/listinfo/rio-pm
> >
> >
> > ___
> > Rio-pm mailing list
> > Rio-pm@pm.org
> > http://mail.pm.org/mailman/listinfo/rio-pm
> ___
> Rio-pm mailing list
> Rio-pm@pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
  ___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

Re: [Rio-pm] Chaves de hash

2012-12-04 Thread Junior Moraes
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  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  :
> >> 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 
> >>
> >>> 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@pm.org
> >> http://mail.pm.org/mailman/listinfo/rio-pm
> >
> >
> > ___
> > Rio-pm mailing list
> > Rio-pm@pm.org
> > http://mail.pm.org/mailman/listinfo/rio-pm
> ___
> Rio-pm mailing list
> Rio-pm@pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

Re: [Rio-pm] Chaves de hash

2012-12-04 Thread Tiago Peczenyj
brinque com os valores

https://gist.github.com/4205775

1,0
0,1
6,666
666,6

etc

2012/12/4 Aureliano Guedes 

>  Alguem passa um exemplo onde esteja evidente a diferença entre & && e and!
> Um caso onde em um de certo e em outro não!
>
> > From: bla...@gmail.com
> > Date: Tue, 4 Dec 2012 14:00:45 -0200
>
> > To: rio-pm@pm.org
> > Subject: Re: [Rio-pm] Chaves de hash
> >
> > 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 :
> > >> 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 
> > >>
> > >>> 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@pm.org
> > >> http://mail.pm.org/mailman/listinfo/rio-pm
> > >
> > >
> > > ___
> > > Rio-pm mailing list
> > > Rio-pm@pm.org
> > > http://mail.pm.org/mailman/listinfo/rio-pm
> > ___
> > Rio-pm mailing list
> > Rio-pm@pm.org
> > http://mail.pm.org/mailman/listinfo/rio-pm
>
> ___
> Rio-pm mailing list
> Rio-pm@pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>



-- 
Tiago B. Peczenyj
Linux User #405772

http://pacman.blog.br
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

Re: [Rio-pm] Chaves de hash

2012-12-04 Thread Adriano Ferreira
2012/11/30 Aureliano Guedes :
> Quanto ao and e o &&, o && consome menos memória que o and, por ser short
> circuits??

Não. A única diferença é a precedência. Ambos fazem "short circuit".

pirl @> sub { $x and $y }
sub {
package Shell::Perl::sandbox;
use warnings;
use strict 'refs';
$y if $x;
}
pirl @> sub { $x && $y }
sub {
package Shell::Perl::sandbox;
use warnings;
use strict 'refs';
$y if $x;
}
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm


Re: [Rio-pm] Chaves de hash

2012-12-04 Thread Adriano Ferreira
2012/12/4 Aureliano Guedes :
> Alguem passa um exemplo onde esteja evidente a diferença entre & && e and!
> Um caso onde em um de certo e em outro não!

Não acredite em tudo que você ouve, mesmo na lista da Rio-pm. Dizer
que usar "and" em

 if ($keys <= $min and $keys >= $max) {


é um erro, é um exagero dos grandes, quase purismo.

Em geral, só uso o "and" quando estou fazendo uma conjunção de
"statements" (do mesmo tipo que o "or") como nos exemplos clássicos

  my $product = current_product()
   and return $product->description;

  open my $f, '<', 'file.txt'
  or die "Bad kitty: $@";

  my $var = frobnicate()
   or return;  # exit the current function if result of
frobnicate() is false

E o "&&" eu deixo só para conjunção de expressões. Por exemplo, eu usaria

 if ($keys <= $min && $keys >= $max) {

porque isto parece natural para mim. No entanto, isto é puramente uma
questão de estilo, e programadores têm estilos diferentes. Na base de
código em que trabalho, você encontra os dois tipos de expressão com
&& e "and" (ou a dicotomia similar entre || e "or"). Eu não diria para
o Graham Barr que ele usou "and" / "or" errado (ainda que eu
preferisse "&&" / "||" em alguns lugares). =)

Happy coding!
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm


Re: [Rio-pm] Chaves de hash

2012-12-04 Thread Adriano Ferreira
2012/12/4 Blabos de Blebe :
> 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.

Sim, existem operadores de "short circuit" que são aqueles que podem
ou não completar a avaliação ("evaluation") do segundo argumento
baseado no primeiro. Este é o caso dos operadores lógicos

 and or xor err
 && || ^ //

Assim em

$a = 0; ++$a || ++$a; $a  #  $a termina como 1

o segundo "++$a" nunca vai ser executado, mas em

$a = -1; ++$a || ++$a; $a

o primeiro "++$a" deixa 0 em $a e o segundo "++$a" deixa 1.

Você não pode representar estes operadores como funções

 f( operando1, operando2 )

onde todos os operandos são calculados antes da invocação de "f" - que
é o mesmo de caso de se representar os comandos condicionais "if" e
"unless". Aposto que vocês lembraram das aulas de linguagem
funcionais, "applicative vs normal order evaluation", etc.
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm


Re: [Rio-pm] Chaves de hash

2012-12-04 Thread Blabos de Blebe
> (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 :
> 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  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  :
>> >> 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 
>> >>
>> >>> 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

Re: [Rio-pm] Chaves de hash

2012-12-04 Thread Vinícius Miasato
last;

Em 4 de dezembro de 2012 14:54, Blabos de Blebe  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 :
> > 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 
> 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  :
> >> >> 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 
> >> >>
> >> >>> 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

Re: [Rio-pm] Chaves de hash

2012-12-04 Thread Aureliano Guedes

Ok, segundo o perldoc:
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: the right
expression is evaluated only if the left expression is true.

Acho que não é nada impactante a diferença de usar && ou and em dias normais, 
mas quando trabalhar bit-a-bit acho que o && é mais apropiado 

Date: Tue, 4 Dec 2012 15:23:04 -0200
From: viniciusmias...@gmail.com
To: rio-pm@pm.org
Subject: Re: [Rio-pm] Chaves de hash

last;

Em 4 de dezembro de 2012 14:54, Blabos de Blebe  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 :

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

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

>> >>

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

Re: [Rio-pm] Chaves de hash

2012-12-04 Thread Renato Santos
Gente, não tem diferença na comparação!!
é só na ordem que as coisas ocorrem conforme as coisas foram escritas!!

alguem ai ja disse:

$c = $a && $b  *COMPILA PRA *$c = ( $a && $b )
$c = $a and $b *COMPILA PRA* ($c = $a) and $b

2012/12/4 Aureliano Guedes 

> Acho que não é nada impactante a diferença de usar && ou and em dias
> normais, mas quando trabalhar bit-a-bit acho que o && é mais apropiado
>



-- 
Saravá,
Renato CRON
http://www.renatocron.com/blog/
@renato_cron 
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm

Re: [Rio-pm] Chaves de hash

2012-12-04 Thread Adriano Ferreira
2012/12/4 Aureliano Guedes :
> mas quando trabalhar bit-a-bit acho que o && é mais apropiado

Para trabalhar bit-a-bit, os operadores bit-a-bit como o &
provavelmente seriam mais adequados.

Bitwise And
http://perldoc.perl.org/perlop.html#Bitwise-And

Bitwise Or and Exclusive Or
http://perldoc.perl.org/perlop.html#Bitwise-Or-and-Exclusive-Or
___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm


Re: [Rio-pm] Chaves de hash

2012-12-04 Thread Aureliano Guedes

O exemplo do junio é bacana:

use Data::Printer;
my $a = 1;
my $b = 0;

my $c = $a && $b;
my $d = $a and $b;
p $c;
p $d;

> Date: Tue, 4 Dec 2012 15:50:13 -0200
> From: a.r.ferre...@gmail.com
> To: rio-pm@pm.org
> Subject: Re: [Rio-pm] Chaves de hash
> 
> 2012/12/4 Aureliano Guedes :
> > mas quando trabalhar bit-a-bit acho que o && é mais apropiado
> 
> Para trabalhar bit-a-bit, os operadores bit-a-bit como o &
> provavelmente seriam mais adequados.
> 
> Bitwise And
> http://perldoc.perl.org/perlop.html#Bitwise-And
> 
> Bitwise Or and Exclusive Or
> http://perldoc.perl.org/perlop.html#Bitwise-Or-and-Exclusive-Or
> ___
> Rio-pm mailing list
> Rio-pm@pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
  ___
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm