2012-06-04 83 views
1

我只是在尋找一些有關最佳實踐的建議。檢查空的字符串或空白字符的最佳方法是什麼?在Perl中檢查空字符串

我通常使用像這樣的$string =~/^\s*$/正則表達式來查看變量是否爲空。有一種更爲接受的方式,或者這種方式與其他方式一樣好?使用正則表達式還是chomp,然後檢查空字符串更好?

謝謝。

+2

'chomp'和正則表達式不產生相同的結果... – 2012-06-04 05:47:11

+0

我看到什麼你意思是。感謝您指出。 – Hameed

回答

3

就個人而言,我通常反轉意義,並搜索單個非空白字符。所以我會這樣說:

next unless $string =~ /\S/; 

由於池上提到,\s(和\S)可有點特質究竟被認爲是什麼字符的空白,並且可以使用\p{Whitespace}(或在我的情況\P{Whitespace})爲更一致的結果。

出於好奇,我以not /\S//^\s*\z/爲基準。在一個80字符的字符串(使用Perl 5.14.2)中,我發現not /\S/的空格字符串的速度快了大約20%,而/^\s*\z/的空格字符串的速度大約快了30%。檢查空行不可能是程序中的瓶頸,但使用更簡單的正則表達式肯定不會造成傷害。

use Benchmark 'cmpthese'; 

our $text = ' ' x 80; 
#our $text = 'abcd' x 20; 

cmpthese(-3, { 
    'pos' => '$text =~ /^\s*\z/', 
    'neg' => 'not $text =~ /\S/', 
    'negU' => 'not $text =~ /\P{Whitespace}/', 
}); 

例結果空間:

  Rate pos negU neg 
pos 3562012/s -- -2% -15% 
negU 3651619/s 3% -- -13% 
neg 4194275/s 18% 15% -- 

示例結果對於非空間:

  Rate negU neg pos 
negU 4951234/s -- -3% -24% 
neg 5112271/s 3% -- -22% 
pos 6555251/s 32% 28% -- 
+0

非常感謝您爲此付出更多努力:) – Hameed

2

這非常好(儘管/^\s*\z/會少一些冗餘)。

注意:它不匹配垂直製表符(U + 000B)。你可以使用\p{Whitespace}

注意:除非使用use 5.012;/u,否則一個錯誤使得它在某些時間只匹配無間斷空格(U + 00A0)。 \p{Whitespace}不受該錯誤影響。

+0

感謝您花時間回答問題。 – Hameed