我只是在寻找一些关于最佳实践的建议。检查空字符串或仅包含空格字符的字符串的最佳方法是什么?
我通常使用这样的正则表达式$string =~/^\s*$/
来查看变量是否为空白。有没有更被接受的方式,或者这和其他方式一样好?使用正则表达式或 chomp 然后检查空字符串更好吗?
谢谢。
就个人而言,我通常会颠倒意义,并搜索单个非空白字符。所以我会说:
next unless $string =~ /\S/;
正如 ikegami 所提到的,\s
(and \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% --
这非常好(虽然/^\s*\z/
会少一些冗余)。
注意:它不会匹配垂直制表符 (U+000B)。你可以使用\p{Whitespace}
它。
注意:一个错误使它在某些时候只匹配无间断空格 (U+00A0),除非使用use 5.012;
or /u
。\p{Whitespace}
不受该错误的影响。