Página 1 de 1

Mútiples variables con if

NotaPublicado: 2015-12-21 15:00 @666
por netsoul
El siguiente código está mal. Mi intención es hacer un comparación de 3 (o más) variables e imprimir cuando todas son iguales, pero quiero hacerlo de forma más corta sin if anidadas, y si es posible sin módulos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @a = 1;
  2. my @b = 1;
  3. my @c = 1;
  4.  
  5. if (@a == @b == @c){
  6.  #print si todos son iguales
  7.  #no print si uno es diferente
  8. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿Podría existir una solución elegante para esto?

¡Gracias!

Re: Mútiples variables con if

NotaPublicado: 2015-12-22 00:09 @047
por MARKO
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @a = 1;
  2. my @b = 1;
  3. my @c = 1;
  4.  
  5. if (@a == @b and @b == @c){
  6.  #print si todos son iguales
  7. }
  8. else{
  9.  #no print
  10. }
  11.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: Mútiples variables con if

NotaPublicado: 2015-12-22 04:20 @222
por explorer
El código de MARKO contiene un error muy frecuente: al poner array en contexto numérico, los array se convierten al número de elementos que contienen.

Entonces, lo que hace el código de MARKO es comparar el número de elementos, pero no los propios elementos (se ve fácil que no funciona si inicializamos los array con otro valor, por ejemplo, '2'.

Y el operador '==' es numérico (¿qué ocurre cuando los elementos son de otro tipo?) y no actúa sobre todos los elementos de los array.

No queda más remedio que comparar elemento por elemento de los array.

Una forma cómoda de resolverlo es con el módulo Array::Utils:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Array::Utils qw(array_diff);
  2.  
  3. my @a = 1 .. 4;
  4. my @b = 2 .. 8;
  5.  
  6. if ( !array_diff(@a, @b) ) {
  7.         # hacer algo cuando son diferentes
  8. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Como netsoul no quiere usar módulos... pues tendrá que escribir más líneas... o usar el par de líneas que usa internamente Array::Utils ;)