2009-04-07 21 views
6

que tienen el siguiente fragmento de código en mi programa:¿Cómo puedo diferenciar entre 0 y el espacio en blanco en Perl?

$val = chr(someFunction()); 

if($val == " ") 
{ 
    #do something 

} 
elsif($val == 0) 
{ 
    #do something else 
} 

Pero cada vez que se pasa a 0 $ val, la parte si se ejecuta en lugar del elsif la que espero que me ejecutado.

¿Cómo puedo solucionar esto?

Gracias.

Respuesta

23

El operador == se utiliza para comparar valores numéricos. Si desea comparar cadenas, debe usar el operador eq.

if ($val eq " ") ... 
+0

Además, ¿está seguro de que desea probar si $ val tiene exactamente un carácter de espacio? Si desea ejecutar la primera rama de su instrucción "if" siempre que $ val contenga uno o más espacios, use una expresión regular en su lugar. –

5

Hay varias maneras de solucionar este (TIMTOWDI). Se podía importar la función looks_like_a_number del paquete estándar Scalar::Util:

if (looks_like_a_number($val) and $val == 0) { 
    #do something 
} 

se puede utilizar el operador de igualdad de cadenas

if ($val eq 0) { 
    #do something 
} 

Si tiene Perl 5.10, se puede utilizar el operador partido inteligente

if ($val ~~ 0) { 
    #do something 
} 

Y muchos más. El método que use depende en gran medida de lo que esté tratando de lograr.

+0

Muchas gracias por la explicación :) –

3

Si tenía habilitadas las advertencias, sabría cuál era el problema.

Ejecutar este:

use strict; 
use warnings; 

my $val = chr(someFunction()); 

if($val == " ") 
{ 
    #do something 

} 
elsif($val == 0) 
{ 
    #do something else 
} 

sub someFunction { 
    return 1; 
} 

Y se obtiene: C:> test.pl argumento "" no es numérica de la ecuación numérica (==) en C: \ test.pl línea 6. argumento "^ a" no es numérico en eq numérico (==) en C: \ test.pl línea 6.

Adición de diagnóstico de uso nos da esta explicación adicional:

(W numeric) The indicated string was fed as an argument to an operator 
    that expected a numeric value instead. If you're fortunate the message 
    will identify which operator was so unfortunate. 

Entonces, dado que no queremos eq numérico, queremos cadena eq: eq. Si aún no lo sabía, puede buscar en perldoc perlop para leer sobre Equality Operators.

Este es un ejemplo clásico de cómo el uso de warnings y strict pragmas ahorra tiempo.

Cuestiones relacionadas