Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中,如何判断字符串是否是数字?_Perl - Fatal编程技术网

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

在Perl中,如何判断字符串是否是数字?,perl,Perl,我正在使用Perl将一些XML转换为JSON。如果XML属性是一个数字,我不想在它周围加引号,这样JSON就会将它视为一个数字而不是字符串。如何判断Perl字符串是否是数字(仅包含数字0到9,可能还有一个小数点)?尝试: 例如: 对于数字的格式,提供了相当明确的规则,因此以下正则表达式应该可以工作: /^-?(0|([1-9][0-9]*))(\.[0-9]+)?([eE][-+]?[0-9]+)?$/ 我认为perlfaq的问题解决了你们的问题 一般来说,问题在于定义您想要读取的数字 “-

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

尝试:

例如:

对于数字的格式,提供了相当明确的规则,因此以下正则表达式应该可以工作:

/^-?(0|([1-9][0-9]*))(\.[0-9]+)?([eE][-+]?[0-9]+)?$/
我认为perlfaq的问题解决了你们的问题

一般来说,问题在于定义您想要读取的数字

  • “-1.312”是有效数字吗
  • “inf”是什么
  • 5.34123412E-03

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

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

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

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

我认为(根据最近的经验)您在进行任何手动XML->JSON转换时都犯了错误。在这个过程中,我遇到了许多陷阱,其中包括错误转义的字符

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


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

假设您不需要支持不寻常的东西(如sci符号),这几乎是可行的(而且非常简单):


它不能完全工作的原因是,只要至少有一个数字,你就可以在任何地方使用连字符和点(可以随意使用)--1--2'的计算结果为零,“1.2.3.4.5”的计算结果为1.2(忽略第二个点和后面的所有内容)。这可能是您的问题,也可能不是。

请注意,对于“inf”、“nan”、“1E02”和一些您可能不希望成为数字的字符串,looks\u-like\u number返回true。为什么
1E02
不是一个期望成为数字的字符串?它是100的科学符号。“0”与“0e0”或“0.0”或“-0”相同吗?Perl通常这么认为,但是您的测试产生了相反的结果。
if( $value eq $value+0 ){
  print "$value is a number\n";
}
#!/usr/bin/perl

my $foo = '1234.5';

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