簡體   English   中英

在Perl中,如何判斷字符串是否為數字?

[英]In Perl, how can I tell if a string is a number?

我使用Perl將一些XML轉換為JSON。 如果XML屬性是一個數字,我不想在它周圍加上引號,以便JSON將其視為數字而不是字符串。 如何判斷Perl字符串是否為數字(僅包含0到9的數字,可能還有一個小數點)?

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

JSON規范對數字的格式提供了相當明確的規則,因此以下正則表達式應該有效:

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

您可以將其強制轉換為數字,然后將其與原始字符串進行比較。

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

(注意:它只適用於簡單數字,如123或12.3)

我認為(根據最近的經驗)你在做任何類型的手動XML-> JSON轉換時都會犯錯誤。 我在這個過程中遇到了很多問題,尤其是涉及錯誤轉義的字符。

我建議使用許多XML :: *模塊之一(我使用XML :: Simple)解析XML,然后使用JSON :: XS將其渲染為JSON。 JSON :: XS允許您將Perl數據結構轉換為JSON; XML :: Simple將XML解析為Perl數據結構。 與此同時,您可以根據需要操作Perl數據結構。

底線是您不再關心引用/轉義字符。

假設你不需要支持不尋常的東西(比如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(第二個點和后面的所有內容都被忽略)。 這對您來說可能是也可能不是問題。

我認為來自perlfaq的這個問題解決了你的問題。

通常,問題在於定義您想要讀取的數字。

  • 是“-1.312”有效號碼?
  • 是“inf”?
  • 5.34123412E-03?

您可以更輕松地將XML讀入Perl中的數據結構,並讓Perl的JSON庫為您解決問題。 它已經檢查過了,所以除非你的數字實際上是XML中的一個字符串(例如它后面有一個空格等) JSON->encode()會將它編碼為JSON編號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM