Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
894
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как узнать, имеет ли переменная числовое значение в Perl?
Есть ли простой способ в Perl, который позволит мне определить, является ли данная переменная числовой? Что-то в этом роде ... :
if (is_number($x))
{ ... }
это было бы идеально. Метод, который не будет выдавать предупреждения, когда используется переключатель -w , безусловно, предпочтителен.
Используйте функцию Scalar::Util::looks_like_number() , которая использует внутреннюю функцию Perl C API looks_like_number(), что, вероятно, является наиболее эффективным способом сделать это.
Обратите внимание, что строки "inf" и "infinity" рассматриваются как числа.
Пример:
#!/usr/bin/perl
use warnings;
use strict;
use Scalar::Util qw(looks_like_number);
my @exprs = qw(1 5.25 0.001 1.3e8 foo bar 1dd inf infinity);
foreach my $expr (@exprs) {
print "$expr is", looks_like_number($expr) ? '' : ' not', " a number\n";
}
Дает этот выход:
1 is a number
5.25 is a number
0.001 is a number
1.3e8 is a number
foo is not a number
bar is not a number
1dd is not a number
inf is a number
infinity is a number
Смотреть также:
- perldoc Scalar::Util
- perldoc perlapi для
looks_like_number
Проверьте модуль CPAN Regexp::Common . Я думаю, что он делает именно то, что вам нужно, и обрабатывает все крайние случаи (например, реальные числа, научные обозначения и т. д.). напр.
use Regexp::Common;
if ($var =~ /$RE{num}{real}/) { print q{a number}; }
Первоначальный вопрос состоял в том, как определить, является ли переменная числовой, а не "has a numeric value".
Есть несколько операторов, которые имеют отдельные режимы работы для числовых и строковых операндов , где "numeric" означает все, что изначально было числом или когда-либо использовалось в числовом контексте (например, в $x = "123"; 0+$x, до сложения, $x является строкой, а затем считается числовым).
Один из способов сказать это так:
if ( length( do { no warnings "numeric"; $x & "" } ) ) {
print "$x is numeric\n";
}
Обычно проверка чисел выполняется с помощью регулярных выражений. Этот код будет определять, является ли что-то числовым, а также проверять наличие неопределенных переменных, чтобы не выбрасывать предупреждения:
sub is_integer {
defined $_[0] && $_[0] =~ /^[+-]?\d+$/;
}
sub is_float {
defined $_[0] && $_[0] =~ /^[+-]?\d+(\.\d+)?$/;
}
Вот некоторые материалы для чтения , которые вы должны посмотреть.
Я не верю, что есть что-то построенное для этого. Больше, чем вы когда-либо хотели видеть по этому вопросу, смотрите в разделе Perlmonks об обнаружении числовых данных
Чуть более надежный regex можно найти в Regexp::Common .
Похоже, вы хотите знать, считает ли Perl переменную числовой. Вот функция, которая ловит это предупреждение:
sub is_number{
my $n = shift;
my $ret = 1;
$SIG{"__WARN__"} = sub {$ret = 0};
eval { my $x = $n + 1 };
return $ret
}
Другой вариант - отключить предупреждение локально:
{
no warnings "numeric"; # Ignore "isn't numeric" warning
... # Use a variable that might not be numeric
}
Обратите внимание, что нечисловые переменные будут автоматически преобразованы в 0, что, вероятно, является тем, что вы хотели в любом случае.
Лично я думаю, что путь состоит в том, чтобы полагаться на внутренний контекст Perl, чтобы сделать решение пуленепробиваемым. Хорошее регулярное выражение может соответствовать всем допустимым числовым значениям и ни одному из нечисловых (или наоборот), но поскольку есть способ использовать ту же логику, что и интерпретатор, то безопаснее полагаться на это напрямую.
Поскольку я обычно запускаю свои скрипты с -w , мне пришлось объединить идею сравнения результата "value plus zero" с исходным значением с подходом no warnings , основанным на @ysth:
do {
no warnings "numeric";
if ($x + 0 ne $x) { return "not numeric"; } else { return "numeric"; }
}
Вы можете использовать регулярные выражения, чтобы определить, является ли $foo числом (или нет).
Посмотрите здесь: Как я могу определить, является ли a scalar числом
если ( определено $x && $x !~ m/\D/ ) {} или $x = 0 если ! $x; если ( $x !~ m/\D/) {}
Это небольшое отклонение от ответа Векея, но позвольте мне объяснить, почему я так поступаю.
Выполнение regex на неопределенном значении вызовет выброс ошибок и вызовет выход кода во многих, если не в большинстве сред. Проверка того, определено ли значение, или установка регистра по умолчанию, как я сделал в альтернативном примере перед запуском выражения, как минимум, сохранит ваш журнал ошибок.
Эта функция работает для меня:
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;
}