В Perl, как я могу узнать, является ли строка числом? - PullRequest
9 голосов
/ 11 июля 2009

Я использую Perl для преобразования некоторых XML в JSON. Если атрибут XML является числом, я не хочу заключать его в кавычки, чтобы JSON рассматривал его как число, а не строку. Как я могу определить, является ли строка Perl числом (содержит только цифры от 0 до 9 и, возможно, одну десятичную точку)?

Ответы [ 7 ]

21 голосов
/ 11 июля 2009

Попробуйте Scalar::Util::looks_like_number:

например:.

use Scalar::Util qw(looks_like_number);

if (looks_like_number($thingy)) {
    print "looks like $thingy is a number...\n"
}
19 голосов
/ 11 июля 2009

Спецификация JSON предоставляет довольно четкие правила для формата числа, поэтому должно работать следующее регулярное выражение:

/^-?(0|([1-9][0-9]*))(\.[0-9]+)?([eE][-+]?[0-9]+)?$/
4 голосов
/ 11 июля 2009

Вы можете просто ввести его в число, а затем сравнить его с исходной строкой.

if( $value eq $value+0 ){
  print "$value is a number\n";
}

(Примечание: он будет работать только для простых чисел, таких как 123 или 12,3)

3 голосов
/ 04 декабря 2015

При условии, что вам не нужно поддерживать необычные вещи (например, научную нотацию), это почти работает (и очень просто):

#!/usr/bin/perl

my $foo = '1234.5';

if( $foo =~ /\d+/ ){
    print "$foo is a number\n";
}

Причина, по которой он работает не полностью, заключается в том, что вы можете иметь дефисы и точки в любом месте (столько, сколько пожелаете), если у вас есть хотя бы одна цифра). '--1--2' оценивается как ноль, а '1.2.3.4.5' - как 1.2 (вторая точка и все после игнорируются). Это может или не может быть проблемой для вас.

3 голосов
/ 14 июля 2009

Я думаю (из недавнего опыта), что вы совершаете ошибку, выполняя любой вид ручного преобразования XML-> JSON. Я столкнулся со многими ошибками в процессе, не в последнюю очередь из которых были неправильно экранированные символы.

Я бы порекомендовал проанализировать ваш XML с помощью одного из множества модулей XML :: * (я использовал XML :: Simple), а затем отобразить его как JSON, используя JSON :: XS. JSON :: XS позволяет вам преобразовывать структуру данных Perl в JSON; XML :: Simple анализирует XML в структуре данных Perl. В то же время вы можете манипулировать структурой данных Perl по своему усмотрению.

Суть в том, что вы больше не заботитесь о цитировании / экранировании символов.

2 голосов
/ 11 июля 2009

Я думаю этот вопрос от Perlfaq решит вашу проблему.

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

  • является действительным числом "-1,312"?
  • это "инф"?
  • 5.34123412E-03?
0 голосов
/ 12 июля 2009

Возможно, вам будет проще просто прочитать XML в структуру данных в Perl и позволить библиотеке JSON Perl выяснить это для вас. В нем уже есть проверка, поэтому, если ваш номер на самом деле не является строкой в ​​XML (например, после него есть пробел и т. Д.) JSON->encode() закодирует его как число JSON.

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