2010-10-11 38 views
11

tengo la siguiente secuencia de comandos:

#!/usr/bin/perl 
use warnings; 
use strict; 

my $count = 0; 
my (@first , @second , @third); 

while ($count <= 7){ 

    push (@first , $count); 
    push (@second , $count) if defined $count; 
    push (@third , $count) if $count; 
    $count++; 

} 

print "first: @first\n"; 
print "second: @second\n"; 
print "third: @third\n"; 

Esto produce el siguiente resultado:

first: 0 1 2 3 4 5 6 7 
second: 0 1 2 3 4 5 6 7 
third: 1 2 3 4 5 6 7 

Cuál es la diferencia entre poner if defined $count vs if $count, que no sea el último método no va a añadir el cero a la matriz? He buscado los perldocs pero no he podido encontrar la respuesta.

Respuesta

25

Truth and Falsehood in perlsyn explica qué valores se consideran falso en un contexto booleano:

El número 0, las cuerdas y '0''', la lista vacía () y undef son todas falsas en un contexto booleano. Todos los demás valores son verdaderos

undef es el valor de una variable que nunca se ha inicializado (o que se ha restablecido el uso de la undef function). El defined function devuelve verdadero si el valor de la expresión no es undef.

if $count es falso si $count es el número 0, la cadena '0', la cadena vacía, undef, o un objeto que ha sido overloaded para volver una de esas cosas cuando se utiliza en un contexto booleano. De lo contrario, es verdad. (La lista vacía no se puede almacenar en una variable escalar.)

if defined $count es falso solo si $count es undef.

-1

La forma en que lo leí.

if $count es verdadero solo cuando $count evalúa != 0, por lo que la tercera matriz no tiene 0 en ella.

if defined $count comprueba si el $count como un escalar ha sido creado, y como tiene $count escalar, es el mismo que el primero.

+3

debería ser: "cuando $ count evalúa! = 0" –

+0

@nathan. Cheers –

+0

Ambos funcionan de la misma manera, en realidad. Es el valor que prueban que es diferente. El primero prueba el valor de $ count, el segundo el valor de $ count definido. if() no le importa cómo se obtiene el valor. –

2

El predicado defined prueba si la variable ($count en este caso) está definida en absoluto. En el código que has escrito, siempre se definirá dentro del ciclo porque siempre tiene algún valor.

Si se va a añadir:

undef $count; 
push (@first , 'undef'); 
push (@second , 'undef') if defined $count; 
push (@third , 'undef') if $count; 

después del bucle, que se vería la diferencia. (Tenga en cuenta que he cambiado el código para añadir el literal 'undef' en lugar de $count porque obtendrá efectos engañosos de sumar el valor real undef.

+0

Podría ser un poco más correcto decir que defined() devuelve verdadero o falso yn que if() verifica ese valor. El definido() hace lo mismo con o sin el condicional. –

5

si usted ve la documentación de defined en perldoc continuación, usted encontrará que

  • devuelve un valor booleano diciendo si EXPR tiene un valor distinto que el valor undef indefinido. Si EXPR no está presente, $ _ es facturado.

  • Una simple prueba booleana no distingue entre undef, cero, cadena vacía, y "0", que son todas igualmente falsas.

que significa,

push (@second , 'undef') if defined $count; 

cuando $count = 0, entonces se define porque 0 es diferente de undef y definido vuelve verdadera, pero en este caso push (@third , 'undef') if $count;if condition falla, es por eso que no es presionando 0 en la matriz.

3

El if decide ejecutar su bloque (o estado de cuenta individual) mirando el valor de la expresión se le da:

if(EXPR) { ... } 

Si esa expresión es verdadera, se ejecuta su bloque. Si esa expresión es falsa, no es así.

Esa expresión puede ser casi cualquier cosa. Perl evalúa la expresión, reduciéndola a un valor que es verdadero o falso. El if() luego mira ese valor.

Por lo tanto, eliminando esa parte de su pregunta, se queda con "¿Cuál es la diferencia entre defined $count y $count". Bien, uno es el valor de retorno para defined y el otro es cualquier valor almacenado en $count.

Cuando desee averiguar qué está haciendo un código en particular, córtelo en el mismo proceso lógico que perl, paso por paso. Vea lo que hace cada paso y, a menudo, podrá responder sus propias preguntas. :)

Usted dice que ha buscado en la documentación, pero no estoy seguro de dónde miró. Si desea buscar una función incorporada, puede utilizar el interruptor de perldoc -f:

$ perldoc -f defined 

Si desea leer sobre la sintaxis de Perl para cosas tales como if, eso es en perlsyn.

Tengo una guía para principiantes sobre los documentos de Perl en Perl documentation documentation.

0

Como cualquier fuble kno, "El número 0, las cadenas '0' y '', la lista vacía() y undef" no deben ser igual a falso porque no son de naturaleza booleana. Escribir código que se base en esta perversión, aunque sea técnicamente correcto, es engañoso y debe desaconsejarse enérgicamente. Al igual que las malas hierbas y las mariquitas.

Cuestiones relacionadas