2011-03-11 30 views
10

¿Existe un método único para determinar si un valor de variable es un número, ya que los valores también podrían estar en notación científica (por ejemplo, 5.814e-10)?Perl, ¿cómo determinar si un valor variable es un número?

+4

"¿hay método único" - no, esto es Perl, TMTOWTDI! :) – Quentin

+5

posible duplicado de [¿Cómo puedo saber si una variable tiene un valor numérico en Perl?] (Http://stackoverflow.com/questions/12647/how-do-i-tell-if-a-variable-has -a-numérico-valor-en-perl) – daxim

Respuesta

23

El módulo de núcleo Scalar::Util exporta looks_like_number(), que da acceso a la API de Perl subyacente.

looks_like_number EXPR

devuelve verdadero si el Perl piensa EXPR es un número.

+1

gracias! funciona muy bien – Gordon

16

De perlfaq4: How do I determine whether a scalar is a number/whole/integer/float?

if (/\D/)   { print "has nondigits\n" } 
    if (/^\d+$/)   { print "is a whole number\n" } 
    if (/^-?\d+$/)  { print "is an integer\n" } 
    if (/^[+-]?\d+$/) { print "is a +/- integer\n" } 
    if (/^-?\d+\.?\d*$/) { print "is a real number\n" } 
    if (/^-?(?:\d+(?:\.\d*)?|\.\d+)$/) { print "is a decimal number\n" } 
    if (/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/) 
      { print "a C float\n" } 

También hay algunos módulos de uso común para la tarea.

Scalar::Util (distribuido con 5.8) proporciona acceso a la función interna de perl looks_like_number para determinar si una variable se parece a un número.

Data::Types exporta funciones que validan tipos de datos utilizando tanto la expresión anterior como otras expresiones regulares.

En tercer lugar, hay Regexp::Common que tiene expresiones regulares para hacer coincidir varios tipos de números.

Esos tres módulos están disponibles desde el CPAN

0

Adaptado de una respuesta en How do I tell if a variable has a numeric value in Perl? -

for my $testable (qw(1 5.25 0.001 1.3e8 foo bar 1dd 0)) 
{ 
    printf("%10s %s a number\n", 
      $testable, 
      isa_number($testable) ? "is" : "isn't") 
} 

sub isa_number { 
    use warnings FATAL => qw/numeric/; 
    my $arg = shift; 
    return unless defined $arg; 
    eval { $arg + 0; 1 }; 
} 
+1

Tu 'isa_number' piensa que '' 0'' no es un número. –

+0

@ Ven'Tatsu: correcto, por supuesto, gracias. Equilibrado. – Ashley

Cuestiones relacionadas