Foros del Web » Programación para mayores de 30 ;) » Programación General »

No entiendo que hace esta línea!

Estas en el tema de No entiendo que hace esta línea! en el foro de Programación General en Foros del Web. Que tal, soy novato en perl y no me había topado anteriormente con una sentencia como esta. Código: for (0..$#lineas) ($j) and ($salida .= $lineas[$_]); ...
  #1 (permalink)  
Antiguo 02/01/2008, 16:46
 
Fecha de Ingreso: septiembre-2002
Ubicación: México
Mensajes: 356
Antigüedad: 21 años, 8 meses
Puntos: 0
No entiendo que hace esta línea!

Que tal, soy novato en perl y no me había topado anteriormente con una sentencia como esta.

Código:
for (0..$#lineas)
 ($j) and ($salida .= $lineas[$_]);
Entiendo que esta entrando a un loop y que en el segundo paréntesis va concatenando lo que trae cada línea lo que por más que busco no le encuentro significado es la parte del ($j) and .

Me podrían explicar que es lo que hace?

Saludos!!
  #2 (permalink)  
Antiguo 02/01/2008, 17:37
Colaborador
 
Fecha de Ingreso: mayo-2006
Ubicación: Valladolid
Mensajes: 524
Antigüedad: 18 años
Puntos: 11
Re: No entiendo que hace esta línea!

Está comprobando si $j es falso o verdadero. Y (AND) en ese caso, ejecuta la otra parte del and.

O de otra forma: el and evalúa las dos partes de la expresión, pero primero mira la parte izquierda: si es falsa, no ejecuta la expresión de la derecha (porque no hace falta porque el resultado del and siempre será falso).

La línea se puede reescribir como:

Código:
if ( $j ) { $salida .= $lineas[$_] }
  #3 (permalink)  
Antiguo 03/01/2008, 16:36
 
Fecha de Ingreso: septiembre-2002
Ubicación: México
Mensajes: 356
Antigüedad: 21 años, 8 meses
Puntos: 0
Re: No entiendo que hace esta línea!

Ahhh, es un if pero expresado en forma diferente a lo normal. Según he llegado a ver, Perl tiene mucho este tipo de sentencias diferentes, como el mismo for (0..$#lineas) que es un for simplificado.

O sea, si $j es verdadero, lo que trae $lineas se concatena a la variable $salida

Muchas gracias amigo, mi idea inicial es que estaba evaluando ambas condiciones, que en realidad es lo que hace, pero como dices, evalúa la de la izquierda y si es verdadera entonces guarda en la variable, que sera verdadera tambien.

Saludos!!
  #4 (permalink)  
Antiguo 03/01/2008, 17:40
Colaborador
 
Fecha de Ingreso: mayo-2006
Ubicación: Valladolid
Mensajes: 524
Antigüedad: 18 años
Puntos: 11
Re: No entiendo que hace esta línea!

Hummm... Digamos que hace lo siguiente: Tenemos un 'and', por lo que tenemos que ver si las dos expresiones de los lados son verdaderas. Eso implica evaluarlas. De la parte izquierda, la evalúa, y si es falsa, ni siquiera mira la derecha, porque ya sabemos entonces el resultado del 'and': falso. En cambio, si es verdadera la parte izquierda, ahora tiene que evaluar la parte derecha.

Y fíjate que NO importa si la parte derecha es falsa o verdadera... lo que importa (para el programador que escribió esa línea) es que la parte derecha se EVALÚA (la expresión se va a EJECUTAR).

Este tipo de construcciones está heredado de los programas escritos en shell, donde es frecuente encadenar sentencias solo si van ejecutando y el resultado va siendo correcto una tras otra. Ejemplo:

cd /tmp && rm *.tmp

La línea anterior (en shell) primero ejecuta la parte izquierda (ir al directorio temporal), y, si es cierta (es decir, EXISTE /tmp y hemos PODIDO entrar en él) entonces el 'and' del shell (&&) mira a ver la parte derecha (ejecuta el borrado de todos los ficheros temporales).

Es decir, el 'and' encadena sentencias que queremos ejecutar solo si la sentencia anterior es verdadera. NO estamos mirando el valor lógico -booleano- de todo el 'and'. Solo nos interesa la ejecución consecutiva.

En Perl, es clásico ver líneas como:

open FICHERO, '<mifichero' or die "ERROR: no puedo leer mifichero: $!\n"

Si el open() falla (falso) el 'or' está obligado a ejecutar el lado derecho, aunque eso signifique su muerte ('die'), pero nosotros queremos precisamente eso, que muera.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:14.