2009-07-11 13 views
9

Estoy usando Perl para convertir algo de XML a JSON. Si el atributo XML es un número, no quiero poner comillas para que JSON lo trate como un número y no como una cadena. ¿Cómo puedo saber si una cadena Perl es un número (contiene solo números del 0 al 9 y posiblemente un punto decimal)?En Perl, ¿cómo puedo saber si una cadena es un número?

Respuesta

19

El JSON specification proporciona reglas bastante claras en el formato de un número, por lo que la siguiente expresión regular debería funcionar:

/^-?(0|([1-9][0-9]*))(\.[0-9]+)?([eE][-+]?[0-9]+)?$/ 
20

Trate Scalar::Util::looks_like_number:

Ej:

use Scalar::Util qw(looks_like_number); 

if (looks_like_number($thingy)) { 
    print "looks like $thingy is a number...\n" 
} 
+7

acaba de darse cuenta de que looks_like_number devuelve verdadero para 'inf', 'nan', '1E02' y probablemente algunas cadenas más que usted puede esperar que no sean números. – mirod

+2

¿por qué '1E02' no se espera que sea un número?es notación científica para 100. –

2

creo this pregunta de perlfaq resuelve tu problema.

En general, el problema es definir qué es exactamente lo que quiere leer como número.

  • ¿número válido "-1.312"?
  • es "inf"?
  • 5.34123412E-03?
4

Puede simplemente forzarlo en un número y compararlo con la cadena original.

if($value eq $value+0){ 
    print "$value is a number\n"; 
} 

(Nota: sólo funcionará para los números simples, como 123 o 12,3)

+0

¿Es "0" lo mismo que "0e0" o "0.0" o "-0"? Perl normalmente piensa que sí, pero tu prueba produce el resultado opuesto. – jrockway

-1

Podría ser más fácil para que usted acaba de leer el XML en una estructura de datos en Perl y dejar que JSON de Perl la biblioteca lo encuentra por ti. Ya lo ha comprobado, de modo que a menos que su número sea realmente una cadena en el XML (por ejemplo, tiene un espacio después, etc.) JSON->encode() lo codificará como un número JSON.

3

Creo que (por experiencias recientes) está cometiendo un error al hacer cualquier tipo de conversión manual XML-> JSON. Me encontré con muchos errores en el proceso, y no menos de los cuales involucraron caracteres escapados incorrectamente.

Recomendaría analizar su XML con uno de los muchos módulos XML :: * (utilicé XML :: Simple) y luego presentarlo como JSON utilizando JSON :: XS. JSON :: XS le permite convertir una estructura de datos de Perl a JSON; XML :: Simple analiza XML a una estructura de datos Perl. Mientras tanto, puedes manipular la estructura de datos de Perl como desees.

En pocas palabras, ya no le importan los caracteres de cita/escape.

3

Suponiendo que no es necesario para apoyar cosas inusuales (como ciencia notación) esta casi funciona (y es muy simple):

#!/usr/bin/perl 

my $foo = '1234.5'; 

if($foo =~ /\d+/){ 
    print "$foo is a number\n"; 
} 

La razón de que no es totalmente el trabajo, ya que puede tener guiones y puntos en cualquier lugar (tantos como quieras) siempre y cuando tengas al menos un dígito presente). '--1--2' se evalúa como cero y '1.2.3.4.5' evals como 1.2 (el segundo punto y todo lo demás se ignoran). Esto puede o no ser un problema para usted.

Cuestiones relacionadas