Есть ли уникальный метод для определения того, является ли значение переменной число, так как значения могут быть также в научной нотации (например, 5.814e-10)?
Perl, как определить, является ли переменное значение числом?
Ответ 1
Основной модуль Scalar::Util
экспортирует looks_like_number()
, который предоставляет доступ к базовому API Perl.
looks_like_number EXPR
Возвращает true, если perl считает, что
EXPR
- это число.
Ответ 2
From 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
Ответ 3
Есть также String:: Numeric и Regexp:: Common:: number.. выглядит удобно.
String:: Nummeric также имеет "сравнение с Scalar:: Util:: looks_like_number()"
Ответ 4
Адаптировано из ответа в Как узнать, имеет ли переменная числовое значение в 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 };
}