Perl, как определить, является ли значение переменной числом? - PullRequest
10 голосов
/ 11 марта 2011

Есть ли уникальный метод, чтобы определить, является ли значение переменной число, так как значения могут быть в научной нотации (например, 5.814e-10)?

Ответы [ 4 ]

23 голосов
/ 11 марта 2011

Основной модуль Scalar::Util экспортирует looks_like_number(), что дает доступ к базовому Perl API.

looks_like_number EXPR

Возвращает true, если perl считает, что EXPRномер.

16 голосов
/ 11 марта 2011

От perlfaq4: Как определить, является ли скаляр числом / целым / целым / с плавающей точкой ?

    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" }

Есть также некоторые часто используемые модули для задачи.

Scalar::Util (распространяется с 5.8) обеспечивает доступ к внутренней функции perl looks_like_number для определения, похожа ли переменная на число.

Data::Types экспортирует функции, которые проверяют типы данных, используя как приведенные выше, так и другие регулярные выражения.

В-третьих, существует Regexp::Common, который имеет регулярные выражения для сопоставления различных типов чисел.

Эти три модуля доступны из CPAN

9 голосов
/ 11 марта 2011

Есть также String :: Numeric и Regexp :: Common :: number .. выглядит удобно.

String :: Nummeric также имеет "сравнение со Scalar :: Util :: look_like_number ()"

0 голосов
/ 11 марта 2011

Адаптировано из ответа в Как определить, имеет ли переменная числовое значение в 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 };
}
...