[英]In Perl, how can I tell if a string is a number, but without using modules?
[英]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(第二個點和后面的所有內容都被忽略)。 這對您來說可能是也可能不是問題。
您可以更輕松地將XML讀入Perl中的數據結構,並讓Perl的JSON庫為您解決問題。 它已經檢查過了,所以除非你的數字實際上是XML中的一個字符串(例如它后面有一個空格等) JSON->encode()
會將它編碼為JSON編號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.