Retroceder   Foros del Web > Programación para sitios web > Perl y CGI

Respuesta
 
Herramientas Desplegado
Antiguo 02-ene-2008, 15:46   #1 (permalink)
yacatl está en el buen camino
 
Fecha de Ingreso: noviembre-2002
Ubicación: México
Mensajes: 354
Enviar un mensaje por Yahoo  a yacatl
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!!
yacatl está desconectado   Responder Citando
Antiguo 02-ene-2008, 16:37   #2 (permalink)
Colaborador
jferrero está en el buen camino
 
Fecha de Ingreso: mayo-2006
Mensajes: 347
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[$_] }
jferrero está desconectado   Responder Citando
Antiguo 03-ene-2008, 15:36   #3 (permalink)
yacatl está en el buen camino
 
Fecha de Ingreso: noviembre-2002
Ubicación: México
Mensajes: 354
Enviar un mensaje por Yahoo  a yacatl
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!!
yacatl está desconectado   Responder Citando
Antiguo 03-ene-2008, 16:40   #4 (permalink)
Colaborador
jferrero está en el buen camino
 
Fecha de Ingreso: mayo-2006
Mensajes: 347
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.
jferrero está desconectado   Responder Citando
Respuesta

No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 19:56.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93