在Perl中,如何判断字符串是否为数字?

时间:2009-07-11 04:50:05

标签: perl

我使用Perl将一些XML转换为JSON。如果XML属性是一个数字,我不想在它周围加上引号,以便JSON将其视为数字而不是字符串。如何判断Perl字符串是否为数字(仅包含0到9的数字,可能还包含一个小数点)?

7 个答案:

答案 0 :(得分:21)

尝试Scalar::Util::looks_like_number

E.g:

use Scalar::Util qw(looks_like_number);

if (looks_like_number($thingy)) {
    print "looks like $thingy is a number...\n"
}

答案 1 :(得分:19)

JSON specification对数字格式提供了相当明确的规则,因此以下正则表达式应该有效:

/^-?(0|([1-9][0-9]*))(\.[0-9]+)?([eE][-+]?[0-9]+)?$/

答案 2 :(得分:4)

您可以将其强制转换为数字,然后将其与原始字符串进行比较。

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

(注意:它只适用于简单数字,如123或12.3)

答案 3 :(得分:3)

我认为(根据最近的经验)您在进行任何类型的手动XML-> JSON转换时都会犯错误。我在这个过程中遇到了很多问题,尤其是涉及错误转义字符的问题。

我建议使用众多XML :: *模块之一解析XML(我使用XML :: Simple),然后使用JSON :: XS将其渲染为JSON。 JSON :: XS允许您将Perl数据结构转换为JSON; XML :: Simple将XML解析为Perl数据结构。与此同时,您可以根据需要操作Perl数据结构。

底线是您不再关心引用/转义字符。

答案 4 :(得分:3)

假设你不需要支持不寻常的东西(比如sci-notation),这几乎可以工作(而且非常简单):

#!/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(第二个点和后面的所有内容都被忽略)。这对您来说可能是也可能不是问题。

答案 5 :(得分:2)

我认为来自perlfaq的this问题可以解决您的问题。

通常,问题在于定义您想要读取的数字。

  • 是“-1.312”有效号码?
  • 是“inf”?
  • 5.34123412E-03?

答案 6 :(得分:-1)

您可能更容易将XML读入Perl中的数据结构,并让Perl的JSON库为您解决。它已经检查过了,所以除非你的数字实际上是XML中的一个字符串(例如它后面有一个空格等),JSON->encode()会将它编码为JSON编号。