【问题标题】:In Perl, how can I tell if a string is a number?在 Perl 中,如何判断字符串是否为数字?
【发布时间】:2015-12-04 07:00:38
【问题描述】:

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

【问题讨论】:

    标签: perl


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      试试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"
      }
      

      【讨论】:

      • 只需要意识到looks_like_number 为'inf'、'nan'、'1E02' 以及一些你可能不认为是数字的字符串返回true。
      • 为什么1E02 不应该是一个数字?这是 100 的科学记数法。
      【解决方案3】:

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

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

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

      【讨论】:

      • “0”是否与“0e0”或“0.0”或“-0”相同? Perl 通常认为是这样,但您的测试会产生相反的结果。
      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        假设您不需要支持不寻常的东西(如 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(第二个点和之后的所有内容都被忽略)。这对您来说可能是也可能不是问题。

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 2011-05-31
              • 2010-09-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-08-26
              • 2010-11-21
              • 1970-01-01
              相关资源
              最近更新 更多