Как мне узнать, имеет ли переменная числовое значение в Perl? - PullRequest
79 голосов
/ 15 августа 2008

Есть ли в Perl простой способ, который позволит мне определить, является ли данная переменная числовой? Что-то вроде:

if (is_number($x))
{ ... }

было бы идеально. Техника, которая не выдаёт предупреждения при использовании переключателя -w, безусловно, предпочтительнее.

Ответы [ 15 ]

1 голос
/ 31 мая 2013

Попробуйте это:

If (($x !~ /\D/) && ($x ne "")) { ... }
0 голосов
/ 18 мая 2017

У меня эта функция работает:

    sub IS_Integer() 
    {
        my $Text = shift;
        my $Integer = 0;

        if ($Text =~ /\D/)
        {
            $Integer = 1;
        }
        if ($Text =~ /^\d+$/)
        { 
            $Integer = 1;
        }
        if ($Text =~ /^-?\d+$/)       
        { 
            $Integer = 1;
        }
        if ($Text =~ /^[+-]?\d+$/)    
        { 
            $Integer = 1; 
        }
        if ($Text =~ /^-?\d+\.?\d*$/) 
        {
            $Integer = 1; 
        }
        if ($Text =~ /^-?(?:\d+(?:\.\d*)?&\.\d+)$/) 
        {
            $Integer = 1;
        }
        if ($Text =~ /^([+-]?)(?=\d&\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/)
        {
            $Integer = 1;
        }

        return $Integer;
    }
0 голосов
/ 26 февраля 2016

Вы можете использовать регулярные выражения, чтобы определить, является ли $ foo числом (или нет).

Взгляните сюда: Как определить, является ли скаляр числом

0 голосов
/ 31 декабря 2015

Лично я думаю, что для этого нужно полагаться на внутренний контекст Perl, чтобы сделать решение пуленепробиваемым. Хорошее регулярное выражение может соответствовать всем действительным числовым значениям и ни одному из нечисловых (или наоборот), но, поскольку есть способ использовать ту же логику, которую использует интерпретатор, она должна быть безопаснее полагаться на это напрямую. 1001 *

Поскольку я склонен запускать свои сценарии с -w, мне пришлось объединить идею сравнения результата «значение плюс ноль» с исходным значением с основанным на no warnings подходом @ysth:

do { 
    no warnings "numeric";
    if ($x + 0 ne $x) { return "not numeric"; } else { return "numeric"; }
}
0 голосов
/ 21 сентября 2013

if (определено $ x && $ x! ~ M / \ D /) {} или же $ x = 0, если! $ Х; if ($ x! ~ m / \ D /) {}

Это небольшой разброс в ответе Викай, но позвольте мне объяснить мои причины такого изменения.

Выполнение регулярного выражения для неопределенного значения приведет к появлению ошибки и к выходу кода во многих, если не в большинстве сред. Проверка, определено ли значение или установка регистра по умолчанию, как я делал в альтернативном примере, перед запуском выражения, как минимум, сохранит ваш журнал ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...